2013-07-22 40 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();