una sirve siguientes que para orden matematicas magnitud los longitud escala datos cual bacteria atomo c++ c math random

c++ - siguientes - orden de magnitud para que sirve



¿Por qué C++ rand() parece generar solo números del mismo orden de magnitud? (9)

En una pequeña aplicación escrita en C / C ++, estoy enfrentando un problema con la función rand y tal vez la semilla:

Quiero producir una secuencia de números aleatorios que son de diferentes órdenes, es decir, con diferentes valores de logaritmo (base 2). Pero parece que todos los números producidos son del mismo orden, fluctuando solo entre 2 ^ 25 y 2 ^ 30.

¿Se debe a que rand() está sembrado con el tiempo de Unix que ahora es un número relativamente grande? ¿Qué estoy olvidando? Estoy sembrando rand() solo una vez al principio de main() .


@ C4stor hizo un gran punto. Pero, para un caso más general y más fácil de entender para humanos (base 10): para el rango de 1 a 10 ^ n, ~ 90% de los números son de 10 ^ (n-1) a 10 ^ n, por lo tanto, ~ 99% de los números pasan de 10 ^ (n-2) a 10 ^ n. Sigue sumando tantos decimales como quieras.

Matemáticas divertidas, si sigues haciendo esto para n, puedes ver que de 1 a 10 ^ n, 99.9999 ...% = 100% de los números son de 10 ^ 0 a 10 ^ n con este método.

Ahora sobre el código, si quieres un número aleatorio con órdenes de magnitud aleatorios, de 0 a 10 ^ n, podrías hacer:

  1. Genera un pequeño número aleatorio de 0 a n

  2. Si conoce el rango que tiene n, genere un gran número aleatorio de orden 10 ^ k donde k> max {n}.

  3. Corta el número aleatorio más largo para obtener los n dígitos de este gran número aleatorio.


El verde más claro es la región entre 0 y 2 25 ; el verde más oscuro es la región entre 2 25 y 2 30 . Las garrapatas son poderes de 2.


Hay exactamente el mismo número de números entre 0 y 2 ^ 29 y 2 ^ 29 y 2 ^ 30.

Otra forma de ver el problema: considera la representación binaria del número aleatorio que generas, la probabilidad de que el bit más alto sea 1 igual a 1/2, y, por lo tanto, obtienes el orden 29 en la mitad de los casos. Lo que quiere es ver un número que estaría por debajo de 2 ^ 25, pero eso significa que 5 bits más altos son todos cero, lo que ocurre con una baja probabilidad de 1/32. Lo más probable es que incluso si lo ejecuta durante mucho tiempo nunca verá el orden por debajo de 15 en absoluto (la probabilidad es algo así como 6 6 veces seguidas).

Ahora, la parte de tu pregunta sobre la semilla. No, la semilla no puede determinar el rango desde el que se generan los números, solo determina el primer elemento inicial. Piense en rand () como una secuencia de todos los números posibles en el rango (permutación predeterminada). La semilla determina dónde comienza a dibujar los números de la secuencia. Por eso, si quiere (pseudo) aleatoriedad, usa la hora actual para inicializar la secuencia: no le importa que la posición desde la que comienza no se distribuya de manera uniforme, lo único que importa es que nunca comience desde la misma posición.


La respuesta básica (y correcta) ya fue dada y aceptada arriba: hay 10 números entre 0 y 9, 90 números entre 10 y 99, 900 entre 100 y 999, etc.

Para una forma computacionalmente eficiente de obtener una distribución con una distribución aproximadamente logarítmica, desea desplazar hacia la derecha su número aleatorio mediante un número aleatorio:

s = rand() & 31; // a random number between 0 and 31 inclusive, assuming RAND_MAX = 2^32-1 r = rand() >> s; // right shift

No es perfecto, pero es mucho más rápido que calcular pow(2, rand()*scalefactor) . Será "grumoso" en el sentido de que la distribución será uniforme para los números dentro de un factor 2 (uniforme para 128 a 255, la mitad de la densidad para 256 a 1023, etc.).

Aquí hay un histograma de la frecuencia de los números del 0 al 31 (en muestras de 1 M):


Necesita ser más preciso: desea valores de logaritmo de base 2 diferentes, pero ¿qué distribución desea para esto? Las funciones estándar de rand () generan una distribución uniforme, necesitará transformar esta salida utilizando la función cuantil asociada a la distribución que desee.

Si nos dice la distribución, podemos decirle la función quantile que necesita.


Si desea diferentes órdenes de magnitud, ¿por qué no simplemente prueba pow(2, rand()) ? ¿O tal vez elegir el orden directamente como rand (), como sugirió Harold?


Si desea usar números aleatorios de un servicio en línea, puede usar wget para eso, es posible que desee ver que también puede usar servicios como random.org para su generación de números aleatorios, puede capturarlos usando wget y luego leer los números de el archivo descargado

wget -q https://www.random.org/integers/?num=100&min=1&max=100&col=5&base=10&format=html&rnd=new -O new.txt

http://programmingconsole.blogspot.in/2013/11/a-better-and-different-way-to-generate.html


Solo hay un 3% de números entre 1 y 2 30 que NO están entre 2 25 y 2 30 . Entonces, esto suena bastante normal :)

Porque 2 25/2 30 = 2 -5 = 1/32 = 0.03125 = 3.125%


use pow(2,rand()) dará las respuestas en orden de magnitud deseada!