una repetir posiciones obtener numeros numero nombres matriz llenar lista letras generar con como azar aleatorios aleatorio aleatorias python random numpy cython

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.