¿Es posible, desde .NET, imitar la aleatorización exacta que usa Java? Tengo una semilla, y me gustaría poder recibir los mismos resultados tanto en C# como en Java al crear un número aleatorio.C#/Java Number Aleatorización
Respuesta
Si tiene el código fuente de la clase java.util.Random
para su implementación de Java, puede fácilmente transferirlo a .NET.
Si necesita ambas aplicaciones (Java y .NET) para usar un cierto generador de números aleatorios, será mejor que implemente uno en ambas plataformas y lo use, ya que la versión proporcionada por el sistema podría cambiar su comportamiento como resultado de una actualización.
(se parece a la especificación Java describe con precisión el comportamiento de su PRNG.)
Pero el algoritmo no es un detalle de implementación y es probable que cambie entre versiones/implementaciones ?IMO sería mejor implementar un algoritmo personalizado tanto en Java como en C# para obtener resultados consistentes. – dtb
@dtb: Estaba pensando en lo mismo. Si va a ser temporal, para fines de prueba, eso sería suficiente. De lo contrario, sí, debes implementar la tuya. –
@dtb: el algoritmo se especifica en la documentación de la clase Random de Java y, por lo tanto, es una especificación. Los detalles de la implementación pueden cambiar, pero dudo mucho que la secuencia real generada por ella sea en una versión futura. En todo caso, es más probable que agreguen un PRNG diferente en una clase separada. Pero dado el alcance previsto de Java y las bibliotecas maduras que realmente hacen un buen trabajo para la generación de números pseudoaleatorios, dudo que eso suceda de todos modos. – Joey
Bueno, puede buscar en el código fuente para Random.java y copiar el algoritmo, constantes, etc etc, pero aleatoria utiliza System.nanoTime en su constructor por lo que no obtendrá los mismos resultados.
De java.util.Random
aleatoria pública() { esto (++ + seedUniquifier System.nanoTime()); }
No me sorprendería en absoluto que la fuente en C# muestre algo similar.
Editar: Ignorar, como se ha señalado, el constructor que toma una semilla de entrada nunca accede al tiempo.
Está usando la misma semilla para ambos, por lo que la semilla predeterminada en la implementación de Java es irrelevante. –
Solo lo usa si no tiene una semilla, hay 2 constructores 'Random()' - No toma nada y usa 'Environment.TickCount' y' Random (int32 num) 'que toma su semilla en lugar de TickCount. –
¿Tal vez tendría sentido implementar su propio generador de números pseudoaleatorio simple? De esta manera, usted tiene el control completo y puede obtener la misma semilla que da los mismos resultados en ambos ambientes. Probablemente un poco más de trabajo que portar uno al otro sin embargo.
Si no necesita un generador de números pseudoaleatorios criptográficamente seguro, entonces yo iría por el Mersenne twister. Puede encontrar el código fuente para C# here y Java here.
Sin embargo, esa no era la pregunta. Y 'java.util.Random' tampoco es criptográficamente seguro, así que obviamente no es h (es | er) preocupación ;-) – Joey
No era la pregunta, pero desde *" imitar la aleatorización exacta que usa Java "* parece difícil imposible de hacer. Me centré en * "Me gustaría poder recibir los mismos resultados tanto en C# como en Java" *. –
Otra opción podría ser escribir sus números aleatorios en un archivo una vez desde una plataforma y luego cargar sus números aleatorios para ambas plataformas desde ese archivo, o puede cargarlos desde un servicio como random.org
No necesita leer el código fuente. La fórmula es una de una sola línea y se da en la documentation for java.util.Random
.
Aquí hay una traducción parcial:
[Serializable]
public class Random
{
public Random(UInt64 seed)
{
this.seed = (seed^0x5DEECE66DUL) & ((1UL << 48) - 1);
}
public int NextInt(int n)
{
if (n <= 0) throw new ArgumentException("n must be positive");
if ((n & -n) == n) // i.e., n is a power of 2
return (int)((n * (long)Next(31)) >> 31);
long bits, val;
do
{
bits = Next(31);
val = bits % (UInt32) n;
}
while (bits - val + (n - 1) < 0);
return (int) val;
}
protected UInt32 Next(int bits)
{
seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
return (UInt32)(seed >> (48 - bits));
}
private UInt64 seed;
}
Ejemplo:
Random rnd = new Random(42);
Console.WriteLine(rnd.NextInt(10));
Console.WriteLine(rnd.NextInt(20));
Console.WriteLine(rnd.NextInt(30));
Console.WriteLine(rnd.NextInt(40));
Console.WriteLine(rnd.NextInt(50));
de salida en ambas plataformas es 0, 3, 18, 4, 20
.
- 1. python re.sub group: number after \ number
- 2. Aleatorización de diseños experimentales equilibrados
- 3. despidiendo Number Pad
- 4. Oracle NUMBER Comparaciones
- 5. ASP.Net Version/Build Number
- 6. Vim Configure Line Number Coloring
- 7. C# y Oracle Number Datatype
- 8. Java Round up Any Number
- 9. estática <T extends Number & Comparable <? Extends number & Comparable <? Número súper >>
- 10. pitones manera más rápida de aleatorización caso de una cadena
- 11. Desactivar la aleatorización de las direcciones de memoria
- 12. Matriz de aleatorización aleatoria PHP Mantener clave => Valor
- 13. Javascript String to Number type coerción
- 14. SQL: Diferencia entre "BETWEEN" vs "current_date - number"
- 15. Edittext line number y currentline cursor position.
- 16. Diferencia de rendimiento entre VARCHAR2 a NUMBER
- 17. Dónde está la aplicación SKU Number Iphone
- 18. Divide Long Long Number como porcentaje
- 19. ¿Cuál es la diferencia entre parseInt() y Number()?
- 20. Método abreviado de Ruby para "if (number in range) then ..."
- 21. Convertir 64 bit windows number to time Java
- 22. ¿Cuál es la diferencia entre Number (...) y parseFloat (...)
- 23. jquery .not (": contiene ('<<any number>>')")
- 24. android get contact picture, name, and mobile number
- 25. Extendiendo el prototipo Number en javascript y el objeto Math?
- 26. protección y aleatorización de la ejecución de la pila en ubuntu
- 27. Cómo deshabilitar la aleatorización de espacio de direcciones para un binario en Linux?
- 28. OR genérico en lugar de AND <T extends Number | CharSequence>
- 29. TFS Build: incluya el nombre de la rama en el campo "build number" de los conjuntos
- 30. Qué significa precisión y escala en el tipo de datos Oracle NUMBER
¿Y qué tan aleatorio es eso? ... Solo preguntando ... –
@Filip: Creo que está implícito que solo quiere la aleatoriedad estocástica. –
Supongo que tienes razón. –