Pregunta

Estoy escribiendo un programa que escribir pruebas estadísticas en Delphi (Delphi debe ser) y he oído que la funcionalidad aleatoria es un tanto extraña. Tienes que llamar randomize para aleatorizar la semilla de la función aleatoria al iniciar el programa.

Me pregunto si la función aleatoria (después de llamar randomize) es lo suficientemente aleatoria para las pruebas estadísticas o un Mersenne Twister se necesita? ¿Alguien tiene alguna idea de la implementación real de azar que me puede decir lo importante que es esto?

¿Fue útil?

Solución

Si Random es suficientemente fiable para sus pruebas estadísticas dependerán del contexto en el que se vaya a usar.

Una vez dicho esto, he escrito varias piezas de código de Delphi que hay necesidad de hacer estadísticas adecuadas, y se han utilizado, por ejemplo, Random para la obtención de varias distribuciones nulos, datos pseudo-repeticiones y resamplings. Hasta ahora, no he encontrado ningún caso en mi propio código, donde habría cedido sesgada Random o resultados poco fiables, o los resultados que han impedido su uso previsto para la prueba estadística. Pero lo que vale para mi código no necesariamente tiene que mantener durante la suya.

En caso de duda, se podría, por supuesto analizar estadísticamente los resultados de las llamadas a Random (por ejemplo en R, SPSS, etc.) y examinar si la distribución de los resultados violen los requisitos de distribución para su prueba estadística en particular (s). [Si usted es un científico adecuado, esto es lo que debe hacer de todos modos.]

Si necesita otros PRNG - por ejemplo, la href="http://www.unilim.fr/pages_perso/jean.debord/tpmath/tpmath.htm" rel="noreferrer"> TPMath biblioteca contiene algunos. (Para las cosas más complicadas, también existe la opción de llamar a las funciones estadísticas elaboradas a partir de R a través de Delphi.)

Otros consejos

PRNG de Delphi, como casi todos los lenguajes de programación PRNG RTL, es un lineal congruente generador .

Es lo suficientemente bueno para la mayoría de las cosas a pequeña escala, pero hay algunas cosas a tener en cuenta. En particular, cuidado con los bits de orden inferior: el patrón de multiplicación y añadir medios que los bits de orden inferior no son muy aleatoria en absoluto. Pero por regla general, sólo se aplica a grandes valores de 32 bits sacó y luego truncado con mod o similar. Usando Random(10) para arrancar un valor entre 0 y 9 utiliza internamente una multiplicación en todo el rango de 32 bits en lugar de una operación de mod.

text alt

No pude resistir.

Si usted está buscando una manera de singularidad garantía de números aleatorios con el tiempo de ejecución más rápida, About.com ha creado un desafío único generador de números aleatorios más rápido, y aplicación de Patrick van Logchem ha sido elegido como el ganador.

A menos que compre un poco de hardware relativamente esotérica, la mejor aproximación a los números al azar una computadora puede proporcionar es una secuencia pseudoaleatoria completamente determinista. En general, la función Randomize utiliza algo de valor relativamente al azar (a menudo basado en el tiempo, pero a veces en los movimientos del ratón - no tengo idea de lo que hace Delphi) como una semilla que proporciona el punto de entrada a la secuencia pseudoaleatoria. Sin esto, el resultado final será volver el mismo conjunto de números aleatorios en el mismo orden cada vez, lo que tiende a frustrar el propósito de la utilización de números aleatorios en el primer lugar.

De acuerdo, soy consciente de que esto no responde a la pregunta acerca de la fiabilidad, pero hay que darle cierta seguridad que requiere que usted llame randomize es un signo de un buen generador de más que de una mala. Hay un montón de pruebas estadísticas que muestran cómo al azar una secuencia de números es, y es probable es que el generador de números aleatorios Delphi es adecuado para muchos propósitos, ya que es un producto maduro.

Sólo para añadir a la piscina de posibilidades - Windows ofrece una gama de built-in funciones de criptografía . Probablemente es un envoltorio de Delphi para ellos también, si no está ya incluido por defecto.

Entre estas funciones es también un azar criptográficamente fuerte generador de Números . Esto es, con mucho, la mejor aleatoriedad obtendrá en el software, porque las semillas se basó en una larga lista de factores. No estoy seguro, pero sospecho que será incluso utilizar un hardware generador de números aleatorios si tiene uno.

Y si eso no es suficiente, también se puede tratar de inscribirse en el cuántica aleatoria binaria de servicio Generador de algunos REALMENTE valores aleatorios.

Desde el sitio web de Embarcadero:

_lrand es la función de generador de números al azar largo. _rand utiliza un generador de números aleatorios congruential multiplicativa con un período de 2 ^ 64 para devolver números pseudo-aleatorios sucesivos en el rango de 0 a 2 ^ 31 - 1.

El generador se reinicializa llamando srand con un valor de argumento de 1. Se puede ajustar a un nuevo punto de partida llamando srand con un número de semillas dado.

Si no cambiaban la aplicación desde la he analizado (Delphi 4 IIRC), el Delphi PRNG se implementa como esto:

Randseed:=int32(Randseed*$08088405)+1
result:=Randseed*Range shr 32

(Pseudocódigo / asumir las multiplicaciones están arbitrariamente grandes números enteros)

Vuelta al azar entre 0..9

StrToInt(copy(FloatToStr(Random),4,1))

Nota: Compruebe FloatToStr longitud (al azar) antes de usar o usar cualquier otro dígito de la parte decimal ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top