2013-07-22 11 views
8

Sto cercando un codice C# breve e moderno per generare un numero doppio casuale tra 1.41421 e 3.14159. dove il numero deve essere il formato [0-9]{1}.[0-9]{5}.Doppio casuale tra i numeri dati

Sto pensando che una soluzione che utilizza Enumerable.Range in qualche modo potrebbe renderlo più sintetico.

+1

si sta chiedendo un decimale, ma le risposte vi darà diversi modi per generare numeri casuali doppie. Se stai cercando un numero decimale casuale [questo] (http://stackoverflow.com/questions/609501/generating-a-random-decimal-in-c-sharp) può aiutare. –

+0

@MechanicalObject a questa scala e precisione non c'è differenza tra 'double' e' decimal', entrambi i sistemi possono rappresentare tutti i 6 numeri numerici in quell'intervallo. –

+0

@ScottChamberlain: Sì, lo so grazie. Ma quello che non so è se dotnetandsqldevelop ha limitato i numeri dopo "." per la domanda o no. 3.14159 sembra come PI e dato il fatto che ha chiesto un decimale, ho pensato che il link potrebbe essere utile. –

risposta

17

Si può facilmente definire un metodo che restituisce un numero casuale compreso tra due valori:

private static readonly Random random = new Random(); 

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

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

È quindi possibile chiamare questo metodo con i tuoi valori desiderati:

RandomNumberBetween(1.41421, 3.14159) 
+8

OP chiesto un decimale –

9

Utilizzare qualcosa come questo.

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

è necessario il numero decimale. Anche se avrai '1.5' non sarà in [0-9] {1}. [0-9] {5} formato –

+0

@lazyberezovsky lo è, perché è una doppia divisione. Ofc. la formazione deve essere fatta come richiesto. – dognose

+1

Penso che l'OP si riferisca a [questo decimale] (https://en.wikipedia.org/wiki/Decimal) non [quello decimale] (http://msdn.microsoft.com/en-us/library/system .decimal.aspx) –

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

Inoltre non si può forzare numero decimale per abbinare il vostro modello. Per esempio. se hai il numero 1.5 non corrisponderà al formato 1.50000. Quindi, si dovrebbe formattare il risultato sotto forma di stringa:

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

tra 1.41421 e 3.14159 – dognose

+0

@dognose ah grazie. Ho pensato che dovesse corrispondere al formato [0-9] {1}. [0-9] {5} –

+0

'System.Decimal' può avere zero finali. Ad esempio con 'var x = 1.50000M;' la chiamata 'x.ToString()' ** restituirà '' 1.50000 "'. Forse la divisione '150000/100000M' fornisce anche zeri finali? –

0

Ho usato questo. Spero che aiuti.

Random Rnd = new Random(); 

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

check out al seguente link per le implementazioni già pronti che dovrebbe aiutare:

MathNet.Numerics, Random Numbers and Probability Distributions

Le vaste distribuzioni sono particolarmente interessanti, costruita in cima ai generatori di numeri casuali (Mersenne Twister, ecc .) derivato direttamente da System.Random, che fornisce tutti i metodi di estensione a portata di mano (ad es. NextFullRangeInt32, NextFullRangeInt64, NextDecimal, ecc.). Ovviamente puoi semplicemente usare SystemRandomSource, che è semplicemente System.Random impreziosito con i metodi di estensione.

Oh, e puoi creare le tue istanze RNG come thread safe se ne hai bisogno.

Davvero molto utile!

+0

questa risposta non è così buona, il collegamento è morto. –

0

qui la mia soluzione, non è bella, ma funziona bene

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(); 
Problemi correlati