2012-04-19 16 views
7

Algo como esto:¿Cómo generar un número aleatorio con 8 dígitos en total en C#? (4 enteros, 4 parte fraccionaria)

1234.5678 
2345.6789 
3456.7890 

Pero no:

123.4567 

Ahora mismo esto:

double number = Math.Ceiling (random.NextDouble () * 10000000) * 0.001; 

pero eso no siempre dame 8 dígitos

¿Algún truco inteligente para hacer esto?

+1

Teniendo en cuenta que la gran mayoría de las fracciones decimales no tienen representación exacta cuando se almacena como doble, que realmente debería estar utilizando el tipo decimal para esto. – spender

+0

¿Es importante que tenga una distribución uniforme? – Servy

+0

@spender: ¿Qué quieres decir? Solo los uso como sembradoras para otras funciones aleatorias. ¿Esto no es eficiente? –

Respuesta

8

Trate random.Next(10000000, 99999999+1)/10000.0d;

EDIT: añadido más 9s

Edit2: solucionado el problema 1 menos

Edit3: añadido más 0s ¿Cómo se elevó tanto mi respuesta?

+0

'var n = random.Next (min, max)' genera un número n con min <= n

+0

Sí, tienes razón. – Matthew

+0

Para facilitar la lectura, recomendaría algo como '10 * 1000 * 1000' y' 100 * 1000 * 1000' en lugar de repetir el ad nauseum de 0 y 9. –

1

Genera 8 dígitos aleatorios individuales y luego los concatena.

+1

Requiere un paso de análisis. Lento. – usr

+2

@usr - No requiere análisis. Todo se puede hacer con matemáticas. –

+0

No creo que sea uniformemente aleatorio. – Servy

3

Use uno de los siguientes:

double number = Math.Ceiling(random.NextDouble() * 9000 * 10000 + 1000 * 10000) * 0.0001; 
double number = Math.Ceiling(random.NextDouble() * 90000000 + 10000000) * 0.0001; 
double number = random.Next(10000 * 10000/10, 10000 * 10000)/10000d; 
double number = random.Next(10000000, 100000000)/10000d; 
1
double number = random.Next(1000 * 1000, 1000 * 1000 * 10)/1000.0 
1
double rndNumber = new Random().NextDouble(); 
string testNumber = (rndNumber * 99999999).ToString("0000.0000"); 
2

¿Alló como esto?

Random r = new Random(); 
var item = r.Next(10000000, 100000000) * 0.0001m; 

por el comentario de Spender abajo ... explicación de por qué se yo uso decimal aquí:

  1. Jon Skeet avergonzó públicamente muchos de nosotros para elegir doble en una de sus conversaciones en CodeMash en Ohio.
  2. Los dobles son utilizados por hipsters, y
  3. Decimal evitará problemas de precisión que se introducen mediante el uso de doble. Tenga en cuenta que cuando necesite muchos dígitos después del punto, debe usar el doble. Si necesita menos, pero los necesita para mantener la precisión, use decimal.
+1

, probablemente vale la pena explicar por qué eligió el decimal para este cálculo. – spender

+0

Hecho. Buen punto. – Robaticus

0
double number = Double.Parse(r.Next(10000000, 99999999).ToString().Insert(4,".")); 
1
Random rnd = new Random(); 
int num1 = rnd.Next(1000,9999); 
int num2 = rnd.Next(1000,9999); 
Console.WriteLine(num1.ToString()+"."+num2.ToString()); 
Cuestiones relacionadas