repetir - llenar una matriz con numeros aleatorios en python
¿Forma correcta de generar números aleatorios en Cython? (3)
¿Cuál es la forma más eficiente y portátil de generar un azar aleatorio en [0,1]
en Cython? Un enfoque es usar INT_MAX
y rand()
de la biblioteca C:
from libc.stdlib cimport rand
cdef extern from "limits.h":
int INT_MAX
cdef float randnum = rand() / float(INT_MAX)
¿Está bien usar INT_MAX
de esta manera? Noté que es bastante diferente de la constante que obtienes de max int de Python:
import sys
print INT_MAX
print sys.maxint
rendimientos:
2147483647 (C max int)
9223372036854775807 (python max int)
¿Cuál es el número correcto de "normalización" para rand()
? EDITAR además, ¿cómo se puede establecer la semilla aleatoria (por ejemplo, sembrada en base a la hora actual) si se utiliza el enfoque C de llamar a rand()
desde libc?
El estándar C dice que rand
devuelve un int
en el rango de 0 a RAND_MAX inclusive, por lo que dividirlo por RAND_MAX (de stdlib.h
) es la forma correcta de normalizarlo. En la práctica, RAND_MAX casi siempre será igual a MAX_INT, pero no confíe en eso.
Debido a que rand
ha sido parte de ISO C desde C89, está garantizado que estará disponible en todas partes, pero no se garantiza la calidad de sus números aleatorios. Sin embargo, si la portabilidad es su principal preocupación, es su mejor opción, a menos que esté dispuesto a usar el módulo random
de Python.
El sys.maxint
de Python es un concepto completamente diferente; es solo el número positivo más grande que Python puede representar en su propio tipo int; los más grandes tendrán que ser largos. Los enteros y largos de Python no están particularmente relacionados con los C''s.
No estoy seguro de si drand es una nueva adición, pero parece hacer exactamente lo que quieres mientras evitas la costosa división.
cdef extern from "stdlib.h":
double drand48()
void srand48(long int seedval)
cdef extern from "time.h":
long int time(int)
# srand48(time(0))
srand48(100)
# TODO: this is a seed to reproduce bugs, put to line of code above for
# production
drand48() #This gives a float in range [0,1)
Me encontré con esta idea mientras investigaba si su método de división generaba suficiente aleatoriedad. La fuente que encontré resalta el hecho de que en mi caso estoy comparando el número aleatorio con un decimal con dos dígitos, así que realmente solo necesito 3 decimales de precisión. Entonces INT_MAX es más que adecuado. Pero, parece que drand48 ahorra el costo de la división, por lo que valdría la pena usarlo.
''c'' stdlib rand () devuelve un número entre 0 y RAND_MAX que generalmente es 32767.
¿Hay alguna razón para no usar el Python random ()?