【问题标题】:Random double between given numbers给定数字之间的随机双倍
【发布时间】:2013-07-22 11:47:03
【问题描述】:

我正在寻找一些简洁的现代 C# 代码来生成 1.414213.14159 之间的随机双精度数。其中数字应为[0-9]{1}.[0-9]{5} 格式。

我在想一些利用Enumerable.Range 的解决方案可能会使这更简洁。

【问题讨论】:

  • 您要求的是小数,但答案为您提供了不同的方式来生成随机双精度数。如果您正在寻找随机十进制数this 可能会有所帮助。
  • @MechanicalObject 在这种规模和精度下,doubledecimal 没有区别,两个系统都可以表示该范围内的所有 6 位数字。
  • @ScottChamberlain :是的,我知道,谢谢。但我不知道 dotnetandsqldevelop 是否限制了 '.' 之后的数字。为了问题的缘故。 3.14159 看起来像 PI,鉴于他要求小数点,我认为该链接可能有用。
  • @MechanicalObject 他的数字是有限的,[0-9]{1}.[0-9]{5} 中的{5} 意味着他的小数点右边总是有 5 位数字。
  • @ScottChamberlain:你是对的!我没有注意那个。我专注于数字 PI 的开头 :) 谢谢。

标签: c#


【解决方案1】:

您可以轻松定义一个返回两个值之间的随机数的方法:

private static readonly Random random = new Random();

private static double RandomNumberBetween(double minValue, double maxValue)
{
    var next = random.NextDouble();

    return minValue + (next * (maxValue - minValue));
}

然后您可以使用所需的值调用此方法:

RandomNumberBetween(1.41421, 3.14159)

【讨论】:

  • OP 要求小数
【解决方案2】:

查看以下链接,了解应该有所帮助的现成实现:

MathNet.Numerics, Random Numbers and Probability Distributions

广泛的分布特别令人感兴趣,它建立在直接从 System.Random 派生的随机数生成器(MersenneTwister 等)之上,所有这些都提供了方便的扩展方法(例如 NextFullRangeInt32、NextFullRangeInt64、NextDecimal 等)。当然,您也可以只使用默认的 SystemRandomSource,它只是使用扩展方法修饰的 System.Random。

哦,如果需要,您可以将 RNG 实例创建为线程安全的。

确实很方便!

【讨论】:

    【解决方案3】:

    使用类似的东西。

    Random random = new Random()
    int r = random.Next(141421, 314160); //+1 as end is excluded.
    Double result = (Double)r / 100000.00;
    

    【讨论】:

    • 十进制数是必需的。此外,如果您将拥有 1.5,它将不是 [0-9]{1}.[0-9]{5} 格式
    • @lazyberezovsky 它是,因为它是一个双重划分。办公室。需要根据需要进行格式化。
    • 我认为 OP 指的是this decimal 而不是that decimal
    【解决方案4】:
    Random r = new Random();
    var number = r.Next(141421, 314160) / 100000M;
    

    您也不能强制十进制数字与您的模式匹配。例如。如果您有1.5 号码,它将与1.50000 格式不匹配。因此,您应该将结果格式化为字符串:

    string formattedNumber = number.ToString("0.00000");
    

    【讨论】:

    • 介于 1.41421 和 3.14159 之间
    • @dognose 啊谢谢。我认为它应该匹配 [0-9]{1}.[0-9]{5} 格式
    • System.Decimal 可以有尾随零。例如使用var x = 1.50000M;,调用x.ToString() 返回"1.50000"。也许150000 / 100000M 的除法甚至给出了尾随零?
    • 对我自己说:除法本身并没有给出尾随零。通过乘以1.00000M,可以确保至少有五个尾随零(除非数字总数超过 28 或 29,这在我们的例子中没有问题)。然后在某些情况下,五个尾随零太多了,可以用Math.Round 截断零(即使它不四舍五入,它也会截断零)。所以像number = Math.Round(number * 1.00000M, 5); 这样的东西将确保number 具有所需的尾随零数量。
    【解决方案5】:

    我用过这个。我希望这会有所帮助。

    Random Rnd = new Random();
    
    double RndNum = (double)(Rnd.Next(Convert.ToInt32(LatRandMin.Value), Convert.ToInt32(LatRandMax.Value)))/1000000;
    

    【讨论】:

      【解决方案6】:

      这是我的解决方案,它不漂亮但效果很好

      Random rnd = new Random(); double num = Convert.ToDouble(rnd.Next(1, 15) + "." + rnd.Next(1, 100)); Console.WriteLine(num); Console.ReadKey();

      【讨论】:

        【解决方案7】:
        JMH BJHBJHHJJ const int SIZE = 1;
                int nnOfTosses,
        
                    headCount = 0, tailCount = 0;
                Random tossResult = new Random();
        
                do
                {
                    Console.Write("Enter integer number (>=2) coin tosses or 0 to Exit: ");
                    if (!int.TryParse(Console.ReadLine(), out nnOfTosses))
                    {
                        Console.Write("Invalid input");
                    }
                    else
                    {
        
                        //***//////////////////
                        // To assign a random number to each element
                        const int ROWS = 3;
                        double[] scores = new double[ROWS];
                        Random rn = new Random();
        
                        // Populate 2D array with random values
                        for (int row = 0; row < ROWS; row++)
                        {
                            scores[row] = rn.NextDouble();
                        }
                        //***//////////////////////////
        
                        for (int i = 0; i < nnOfTosses; i++)
                        {
        
                            double[] tossResult = new double[i];
                            tossResult[i]= tossResult.nextDouble();
        
                        }
                        Console.Write("Number of Coin Tosses = " + nnOfTosses);
                        Console.Write("Fraction of Heads = ");
                        Console.Write("Fraction of Tails = ");
                        Console.Write("Longest run is ");
                    }
                } while (nnOfTosses != 0);
        
                Console.ReadLine();
        

        【讨论】:

          猜你喜欢
          • 2012-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-06
          • 2023-04-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多