¿Cómo puedo crear un valor entero aleatorio de 64 bits en Delphi 2006? La función aleatoria() basada en enteros integrada parece devolver solo valores entre 0 y 2^31.¿Cómo obtener un valor aleatorio de 64 bits en Delphi?
Respuesta
Puedes usar mi GpRandomGen. Implementa el algoritmo Marsaglia/Zaman/James, es extremadamente rápido y supuestamente muy aleatorio. Lanzado como un programa gratuito.
Puede generar 64 bits aleatorios e interpretar el resultado como un entero. (63 bits si está trabajando con enteros con signo y quiere que el resultado no sea negativo.) Equivalentemente, puede tomar dos enteros aleatorios en el rango 0..2^31-1, más dos bits aleatorios adicionales, y concatenarlos para obtener un entero aleatorio de 64 bits.
EDIT: Tenía curiosidad acerca de las propiedades estadísticas de números pseudo-aleatorios generados mediante la concatenación de componentes pseudo-aleatorios y se encontró que (aparentemente) este enfoque podría no funcionar bien en función de su generador pseudo-aleatorio (por supuesto para la verdadera generación de números aleatorios, a partir del ruido atmosférico, la concatenación de bits aleatorios no es un problema). Para uso recreativo, la pérdida de varias propiedades estadísticas podría ser aceptable, pero para un uso más serio podría terminar necesitando un generador pseudoaleatorio personalizado como sugirió @gabr. Aquí hay una pregunta relacionada: Best method of generating a number with 256 random bits?
para responder a mi propia pregunta me ocurrió con el siguiente código:
function GetRandomInt64() : int64;
begin
Int64Rec(result).Words[0] := Random(High(Word));
Int64Rec(result).Words[1] := Random(High(Word));
Int64Rec(result).Words[2] := Random(High(Word));
Int64Rec(result).Words[3] := Random(High(Word));
end;
No estoy seguro si esto es una solución válida o que siempre va a crear el mismo número de seguimiento X + 1 después de un número de resultado determinado X.
Depende de para qué lo use. Esto puede ser adecuado para una fuente simple de aleatoriedad en un juego o simulación.Si se trata de algo relacionado con el cifrado, evite las soluciones personalizadas y ad-hoc. A cada programador finalmente se le ocurre la idea de combinar fuentes aleatorias para crear números aleatorios grandes. Es una muy mala idea en general. – Ferruccio
Es para crear nombres de archivo únicos. No necesita ser seguro de cifrado. – blerontin
@Ferruccio: Fuera de interés, ¿qué pasa con la sugerencia de blerontins? ¿Cómo puede ser explotado? Si necesitaba un número aleatorio de 64 bits y solo tenía un generador de 32 bits, probablemente solo concatenaría y creería que era seguro. ¿Por qué no? –
Genera dos randoms de 32 bits y los empalma.
EDITAR
similares a @ respuesta de Andreas me gusta lo siguiente (equivalente) aplicación:
function Random64: UInt64;
var
Overlay: packed record
a, b: UInt32;
end absolute Result;
begin
Assert(SizeOf(Overlay)=SizeOf(Result));
Overlay.a := Random32;
Overlay.b := Random32;
end;
+1. ¿Por qué hacerlo más complicado de lo necesario? (Blerotin dijo "Es para crear nombres de archivos únicos"). –
Puede usar Int64Rec declarado en SysUtils casting Result, no es necesario declarar otra estructura: Int64Rec (Result) .Hi: = Random32; Int64Rec (Resultado) .Lo: = Random32; –
@Indsandon, sí, ¡eso probablemente sería aún mejor! –
simple:
function Random64: UInt64;
begin
PCardinal(@result)^ := Random32;
PCardinal(cardinal(@result) + 4)^ := Random32;
end;
donde Random32
es su favorito de 32 bits sin signo función de número aleatorio entero.
¿Por qué la manipulación del puntero feo cuando hay una manera más limpia de trabajar en los bytes que componen un valor de 64 bits? ¡Deja que el compilador calcule las compensaciones! :) –
@Indsandon: El código anterior captura de forma más precisa la forma en que * pienso * sobre el problema. –
Y el voto abajo obligatorio, llegó ... –
Cree un GUID (por ejemplo, CoCreateGuid) y vuélvalo a Int64.
O usemos alguna función hash crypto en un GUID. :-) –
- 1. Cómo generar entradas aleatorias de 64 bits con impulso aleatorio
- 2. ¿Cómo obtener TExcelWorksheet (la versión de 64 bits) en XE2?
- 3. ¿Cómo debo preparar mis programas Delphi de 32 bits para un eventual compilador de 64 bits?
- 4. Delphi XE2 - aplicaciones de 64 bits de construcción
- 5. ¿Cómo compilar un programa C++ como de 64 bits en una máquina de 64 bits?
- 6. Aplicaciones Java de 64 bits: ¿Se requiere un SO de 64 bits, un JRE de 64 bits y una Aplicación de 64 bits?
- 7. ¿Cómo inserto un valor aleatorio en mysql?
- 8. binario de base 64 (Delphi)
- 9. ¿Cómo obtener un número aleatorio en pascal?
- 10. ¿Cómo obtener un número aleatorio en JSTL?
- 11. ya desarrollada aplicación de 64 bits permiten
- 12. ¿Ventajas/inconvenientes de ejecutar JVM de 64 bits en un servidor Linux de 64 bits?
- 13. 64 bits de enlace de un archivo objeto
- 14. ¿Aplicación de 32 bits o de 64 bits en el sistema operativo de 64 bits?
- 15. Delphi: ¿cómo recorto un mapa de bits "en su lugar"?
- 16. ¿Cómo agregar el soporte Delphi XE2 de 64 bits a un componente Delphi XE2 32bit VCL simple?
- 17. Cómo imprimir un entero de 64 bits en GCC 4.4.1?
- 18. cómo tener un entero de 64 bits en PHP?
- 19. 64 bits por división de 32 bits
- 20. Obtener un valor doble aleatorio entre -1 y 1
- 21. 64 bits ODBC Excepción
- 22. ¿Dónde puedo obtener el conteo de ticks actual en un volcado de Windows de 64 bits?
- 23. ¿Cómo ejecutar Fsi.exe en 64 bits?
- 24. Generación de un nuevo GUID aleatorio en Delphi IDE
- 25. SendInput falla en 64 bits
- 26. alineación uint32_t en 64 bits?
- 27. ¿Cómo convertir un método a un procedimiento de devolución de llamada en Delphi XE2 de 64 bits?
- 28. generar aleatoria de 64 bits número entero
- 29. ¿Cómo generar un valor BigInteger aleatorio en Java?
- 30. ¿Cómo ejecuto un VBScript en modo de 32 bits en una máquina de 64 bits?
Parece un generador de números aleatorios con todas las funciones, aunque yo preferiría una solución con funciones nativas de Delphi. La frase "este es el generador de números aleatorios más conocido" en la parte superior del archivo parece demasiado seguro de sí mismo :-) – blerontin
Tal vez fue el mejor en 2002. No tengo idea de cuál es el estado del arte en la generación aleatoria hoy en día. – gabr
GpRandomGen 'is' nativo Delphi. No depende de COM, .NET, ASM, etc. Contiene referencias a los artículos de investigación originales publicados, atribución a la implementación original de C, etc. ¿Qué más quieres? –