2013-07-22 42 views
8

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

我想一些解决方案,利用Enumerable.Range在某种程度上可以使这个更简洁。

+1

你问一个小数,但答案给你不同的方式来生成随机双号。如果你正在寻找一个随机十进制数[this](http://stackoverflow.com/questions/609501/generating-a-random-decimal-in-c-sharp)可能会有所帮助。 –

+0

@MechanicalObject在这个尺度和精度下,'double'和'decimal'之间没有区别,两个系统都可以表示该范围内的所有6位数字。 –

+0

@ScottChamberlain:是的,我知道这个谢谢你。但是我不知道的是,如果dotnetandsqldevelop在''之后限制了数字。为了问题的缘故。 3.14159看起来像PI,并且考虑到他要求小数,所以我认为这个链接可能是有用的。 –

回答

17

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

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) 
+8

OP问小数点 –

9

使用这样的事情。

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

十进制数是必需的。另外,如果你有'1.5''它不会在[0-9] {1}。[0-9] {5}格式 –

+0

@lazyberezovsky它是,因为它是一个双重的分裂。 OFC。格式化需要根据需要完成。 – dognose

+1

我认为OP指的是[这个十进制](https://en.wikipedia.org/wiki/Decimal)不是[那十进制](http://msdn.microsoft.com/en-us/library/system .decimal.aspx) –

5
Random r = new Random(); 
var number = r.Next(141421, 314160)/100000M; 

你也不能强迫十进制数来匹配你的格局。例如。如果你有1.5号码,它将不会匹配1.50000格式。所以,你应该格式化结果为字符串:

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

1.41421和3.14159之间 – dognose

+0

@ dognose啊谢谢。我认为它应该匹配[0-9] {1}。[0-9] {5}格式 –

+0

'System.Decimal'可以有尾随零。例如'var x = 1.50000M;'调用'x.ToString()'**将返回'“1.50000”'。也许分区'150000/100000M'甚至会产生尾随零? –

0

我用这个。我希望这有帮助。

Random Rnd = new Random(); 

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

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

MathNet.Numerics, Random Numbers and Probability Distributions

广泛分布是特别感兴趣的,建立在随机数发生器的顶部(梅森旋转算法等)直接从System.Random派生,所有这些都提供了方便的扩展方法(例如NextFullRangeInt32,NextFullRangeInt64,NextDecimal等)。当然,您可以使用默认的SystemRandomSource,它只是System.Random的扩展方法。

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

的确非常方便!

+0

这个答案不太好,链接已死。 –

0

这里我的解决方案,这是不漂亮,但它工作得很好

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

0
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();