Мне нужно выбрать 10 равномерно распределенных случайных чисел от 0 до 1. Поэтому я подумал, что следующий код в python сделает это:

positions = []
for dummy_i in range(1000000):
    positions.append(round(random.random(),1))

Однако при помещении результата в гистограмму результат выглядит следующим образом:

Frequency of numbers rounded to 1 decimal place

Таким образом, округление, кажется, разрушает равномерное распределение, генерируемое random.random (). Интересно, что вызывает это и как предотвратить это. Спасибо за вашу помощь!

4
harlekin 17 Дек 2015 в 14:35

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
3
6502 17 Дек 2015 в 18:31

Ваш способ создания гистограммы неверен. Вы должны получить примерно:

50 Кб для 0 и 1

100 КБ для всех остальных номеров

Но ваша третья корзина имеет значение от 0,2 до 0,3 включительно, в результате чего получается 200 КБ, а ваша четвертая корзина - от 0,3 до 0,4 эксклюзива, что приводит к нулю.

Попробуйте создать гистограмму с краями 0,05, 0,15 и т. Д., Тогда ошибок точности не будет.

2
Daniel 17 Дек 2015 в 11:47

Я думаю, что здесь Numpy может быть чище и эффективнее:

import numpy as np
positions = np.random.random(10000)
positions = np.round(positions, decimals=3)
0
piman314 17 Дек 2015 в 11:51

Попробуй это

positions = []
for dummy_i in range(10):
    positions.append(random.randint (0, 10) / 10)
0
Victor Voronov 17 Дек 2015 в 11:41