Мне нужно выбрать 10 равномерно распределенных случайных чисел от 0 до 1. Поэтому я подумал, что следующий код в python сделает это:
positions = []
for dummy_i in range(1000000):
positions.append(round(random.random(),1))
Однако при помещении результата в гистограмму результат выглядит следующим образом:
Таким образом, округление, кажется, разрушает равномерное распределение, генерируемое random.random (). Интересно, что вызывает это и как предотвратить это. Спасибо за вашу помощь!
4 ответа
Кажется, у вас возникла проблема позже в коде ... (например, при сборе статистики). Проверьте этот меньший фрагмент:
import random, collections
data = collections.defaultdict(int)
for x in range(1000000):
data[round(random.random(),1)] += 1
print(data)
Вы увидите, что 0
и 1
, конечно, имеют около половины выборок других значений, которые все в значительной степени однородны.
Например я получил:
defaultdict(<class 'int'>,
{0.4: 100083,
0.9: 99857,
0.3: 99892,
0.8: 99586,
0.5: 100108,
1.0: 49874, # Correctly about half the others
0.7: 100236,
0.2: 99847,
0.1: 100251,
0.6: 100058,
0.0: 50208}) # Correctly about half the others
Ваш способ создания гистограммы неверен. Вы должны получить примерно:
50 Кб для 0 и 1
100 КБ для всех остальных номеров
Но ваша третья корзина имеет значение от 0,2 до 0,3 включительно, в результате чего получается 200 КБ, а ваша четвертая корзина - от 0,3 до 0,4 эксклюзива, что приводит к нулю.
Попробуйте создать гистограмму с краями 0,05, 0,15 и т. Д., Тогда ошибок точности не будет.
Я думаю, что здесь Numpy может быть чище и эффективнее:
import numpy as np
positions = np.random.random(10000)
positions = np.round(positions, decimals=3)
Попробуй это
positions = []
for dummy_i in range(10):
positions.append(random.randint (0, 10) / 10)
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.