Las computadoras no crean números aleatorios sin base alguna, ya que lo más probable es que el tiempo sea la base universal de la aleatoriedad.
Quiero que crees un código que cree números aleatorios con estas reglas:
- No se permite que el tiempo sea la base, en ningún punto del programa.
- No se permiten funciones aleatorias / pseudoaleatorias predefinidas.
- Los números generados pueden estar dentro de cualquier rango. Bueno, al menos dos enteros diferentes: D
- Los números tienen eco.
popularity-contest
Dadan
fuente
fuente
Respuestas:
JavaScript
¡Eso fue divertido!
Escribí el Mersenne Twister en JS. Entonces, me di cuenta de que tenía que conseguir una semilla de algún lado.
Entonces, decidí que lo obtendría de la API de Stack Exchange. (Podría usar
localStorage
e incrementar un contador, pero eso no es divertido). Entonces, tomé las 10 respuestas activas más recientes, y luego tomé cada 4 o menos dígitos consecutivos en la respuesta y los sumé.Estas semillas son siempre diferentes, ya que Stack Overflow se actualiza constantemente (¡y mi cuota sigue bajando!) Los números incluyen ID de respuestas, ID de preguntas, puntajes, recuentos de votos hacia arriba / hacia abajo, representantes / ID del propietario y los datos del contenedor (cuota y tal ) En una carrera obtuve
256845
, luego270495
, y luego256048
, etc.Esto registra 10 números aleatorios de dos bits de 32 bits en la consola. Salida de muestra:
fuente
Java
La magia está en el
public NoTimeRandom()
. Las matrices convertidas en cadenas pueden confundir a los nuevos programadores, ya que los números son aleatorios. Muestra (parachar[]
:)[C@4a8e91eb
. Elnext
método se copia dejava.util.Random
.Salida de muestra:
Probemos la efectividad de este rng:
En mi respuesta a Aproximate a Bell Curve , la generación de datos que utilicé depende de un buen rng. Vamos a ejecutarlo con esto como el rng. Salida:
Justo como pense. Este es un rng bastante malo.
fuente
C
Compile con el indicador -pthread (o lo que sea que use su compilador).
No estoy seguro de si esto califica o no en base al estándar "no se permite el tiempo", porque básicamente está usando el programador como fuente de entropía al ignorar intencionalmente la seguridad del hilo. Funciona mediante el uso de una función psuedo-aleatoria bastante básica ( generador de números aleatorios de Lehmer ) con una semilla inicial codificada. Luego comienza 20 hilos que ejecutan el cálculo de Lehmer con un conjunto compartido de variables.
Parece funcionar bastante bien, aquí hay un par de carreras consecutivas:
EDITAR: Pensé un poco más sobre esto y me di cuenta de que esto no está basado en el tiempo. Incluso con un planificador completamente determinista, la entropía no proviene de los segmentos de tiempo, sino de la carga de todos los procesos en ejecución en el sistema.
EDITAR 2 Después de inspirarme en @Quincunx al publicar una curva de campana, volqué 12 MB de aleatoriedad en un archivo y lo cargué en CAcert . Falló todas las pruebas acérrimas, pero registró un respetable 7.999573 de 8 en la prueba ENT (solo Potencialmente determinista). Curiosamente, duplicar el número de hilos lo empeoró.
fuente
C
Genera un número aleatorio en el rango de 0-255 tomando la semilla de https://stackoverflow.com/questions usando
wget
.Ejecución de muestra:
fuente
C ++
salida
5 números al azar
tres muestras
fuente
11230576, 0, 11206992, 0, 2053725299
, lo que todavía no me parece aleatorio.perl
¿Qué es toda esta basura con la obtención de semillas a través de Internet? A mí me suena a engaño ;-) Prefiero dar mi semilla a una función hash criptográfica, y dar una salida en el rango de 0 a 2 ^ 160-1 así:
Cada vez que tenga una entropía de calidad incierta, una forma de distribuirla más regularmente (¡pero no aumentar su calidad!) Es canalizarla a SHA1 o MD5 más o menos, como he hecho aquí. Para semillas pre-hash, he usado pid y la dirección de una referencia aleatoria. Por supuesto, podría agregar otras entradas para obtener más entropía, por ejemplo, en x86 puede usar TSC - (pero incluir el código de ensamblaje en perl es un poco difícil, así que lo omití).
Si desea tener una salida diferente a la del tipo en la próxima computadora, simplemente ajuste "some_salt" para que sea una cadena de su agrado. O déjalo fuera por completo si eres minimalista =)
fuente
Java
Mi solución abusa del
hashCode()
método deObject
clase.Salida de muestra:
Motivado por otras respuestas que demuestran la aleatoriedad de la solución, cambié mi solución para devolver los 16 bits del medio
int
devueltos porObject.hashCode()
.Generé un archivo de 19 MB (que consta de 10 7
short
) y lo envié a CACert . Aquí está la captura de pantalla del resultado (se ha editado para que se vea bien, pero los números se dejan como están):Me sorprendió el resultado, ya que marca 7.999991 en la prueba Entropy y pasa (?) Las 7 pruebas Diehard.
fuente
Javascript
Generando al azar con el movimiento del mouse del usuario
Últimos cinco datos copiados:
9637090187003
7828470680762
6045869361238
4220720695015
2422653391073
fuente
Bash, rango: entradas entre 0 y 1
fuente
echo -n & echo $!
lo haré, pero será un RNG muy malo. También puede cambiar 2 con cualquier otro número, pero cuanto mayor sea el número, peor será la "aleatoriedad".Rubí
Lamentablemente, solo Mac. Usamos
sox
para extraer bytes del micrófono (como una cadena, ejem ...), invertirlo para obtener el encabezado de estado al final (* tos *), cortarlo, cortar el encabezado, tomar el MD5 de los fragmentos , deshazte de los caracteres no numéricos del hash, suma los enteros más grandes restantes, pega un0.
frente, conviértelos en un flotador, listo.Genera flotadores de longitud variable en el intervalo
0..1
.fuente
C
Generando al azar usando ID de proceso.
Salida de muestra:
fuente
GIRAR
Si esto fuera código golf , ¡ganaría!
fuente
pitón
La concisión de Python nunca deja de sorprender. Dado que el uso de la imagen aleatoria de imgur aparentemente no es válido, he usado una gran fuente de aleatoriedad: ¡el chat de stackoverflow!
5 ensayos:
No es realmente al azar, pero tampoco lo son.
fuente
whatever.com/random
perl
Vi muchas respuestas que hicieron solicitudes HTTP, lo que me parece un desperdicio porque debajo de las cubiertas hay números aleatorios que se pasan por el cable. Así que decidí escribir un código para deslizar uno a un nivel inferior:
Da puertos aleatorios en el rango 0..65535, teóricamente. En la práctica, hay una serie de puertos que nunca verá, por lo que la distribución está lejos de ser perfecta. Pero lo es, AFACIA la cantidad mínima de trabajo que puede hacer para obtener algo de entropía de un host remoto que tiene un puerto abierto.
PD: el manejo de errores se deja como un ejercicio para el lector ;-)
fuente
C
fuente