Правильный способ генерации случайных чисел в Cython?

Каков наиболее эффективный и переносимый способ генерации случайного случайного в [0,1] в Китоне? Один из подходов – использовать INT_MAX и rand() из библиотеки C:

 from libc.stdlib cimport rand cdef extern from "limits.h": int INT_MAX cdef float randnum = rand() / float(INT_MAX) 

Можно ли использовать INT_MAX таким образом? Я заметил, что он сильно отличается от константы, которую вы получаете от max int int:

 import sys print INT_MAX print sys.maxint 

выходы:

 2147483647 (C max int) 9223372036854775807 (python max int) 

Какой правильный номер «нормализации» для rand() ? EDIT дополнительно, как можно установить случайное семя (например, посеяно на основе текущего времени), если вы используете C-подход вызова rand() из libc?

3 Solutions collect form web for “Правильный способ генерации случайных чисел в Cython?”

В стандарте C указано, что rand возвращает int в диапазоне от 0 до RAND_MAX включительно, поэтому деление его на RAND_MAX (из stdlib.h ) является правильным способом его нормализации. На практике RAND_MAX почти всегда будет равен MAX_INT, но не полагайтесь на это.

Поскольку rand является частью ISO C с C89, он гарантированно будет доступен везде, но никаких гарантий относительно качества его случайных чисел не гарантируется. Если переносимость – это ваша главная проблема, это ваш лучший вариант, если вы не хотите использовать random модуль Python.

Python sys.maxint – это совсем другое понятие; это просто наибольшее положительное число, которое Python может представлять в своем собственном типе int; более крупные должны быть длинными. Python ints и longs не имеют особого отношения к C.

'c' stdlib rand () возвращает число от 0 до RAND_MAX, которое обычно равно 32767.

Есть ли причина не использовать python random ()?

Генерировать случайные целые числа от 0 до 9

Я не уверен, что drand – это новое дополнение, но, похоже, оно делает именно то, что вы хотите, избегая дорогостоящего разделения.

 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) 

Я наткнулся на эту идею , исследуя, сформировал ли ваш метод разделения достаточную случайность. Источник, который я нашел, делает хорошую точку зрения, что в моем случае я сравниваю случайное число с десятичной цифрой с двумя цифрами, поэтому мне действительно нужны только 3 десятичные точки точности. Поэтому INT_MAX более чем достаточно. Но, похоже, drand48 экономит затраты на деление, поэтому его стоит использовать.

  • Должен ли я использовать `random.seed` или` numpy.random.seed` для управления генерацией случайных чисел в `scikit-learn`?
  • Прочитайте небольшой случайный образец из большого CSV-файла в фрейм данных Python
  • Как вы проверяете, что что-то случайное? Или «достаточно случайным»?
  • Создание нескольких независимых случайных потоков в python
  • Как создать «большое» случайное число в Python?
  • Разница между np.random.seed (int) и np.random.seed (array_like)?
  • Как получить нормальное распределение в диапазоне в numpy?
  • Создание дискретных случайных величин с заданными весами с использованием SciPy или NumPy
  • Python - лучший язык программирования в мире.