AWS Lambda плохо генерирует случайные числа? - PullRequest
0 голосов
/ 01 марта 2019

У меня есть лямбда-функция, которая генерирует случайное число от 0 до 22 при каждом вызове.Однако я не чувствую, что число действительно случайное, поскольку я часто получаю одно и то же число подряд, когда быстро запускаю функцию несколько раз.

Время выполнения равно nodejs8.10, и я простовызов Math.floor(23*Math.random()) для генерации номера.

Для отладки я запустил функцию 78 раз в течение примерно 20 минут, загрузил журналы из CloudWatch Logs и поместил числа в файл с именем numbers.txt:

$ cat numbers.txt | tr "\n" " "
5 22 19 7 14 3 14 19 8 1 15 4 7 17 6 5 19 11 18 17 15 5 0 20 11 20 12 12 14 16 5 13 19 19 10 18 21 19 12 20 8 11 16 19 1 1 4 5 2 5 11 3 20 4 2 12 3 6 2 17 20 11 16 1 20 22 1 21 15 17 1 1 1 2 5 5 13 12

Вот как часто генерировалось каждое число:

$ cat numbers.txt | sort | uniq -c
1 0
8 1
1 10
5 11
5 12
2 13
3 14
3 15
3 16
4 17
2 18
7 19
4 2
6 20
2 21
2 22
3 3
3 4
8 5
2 6
2 7
2 8

Числа 1 и 5 генерировались по 8 раз каждый, а 9 не генерировались ни разу.

Есть ли в AWS Lambda какие-то ошибки со случайностью?Могу ли я сделать что-нибудь, чтобы получить больше случайных чисел?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Я не думаю, что эти значения выглядят неслучайно.

Взятие 78 выборок из 23 значений может быть подозрительным, если оно БЫЛО постоянно однородным.Взятие 100 000 выборок из 23 значений выглядело бы подозрительно, если бы оно было НЕ равномерным.

Моделирование в python для демонстрации.

Ваша текущая настройка (78 выборок из 23 значений):

import random
import numpy as np

num_vals = 23
num_samples = 78

results = [0] * num_vals

for i in range(num_samples):
    results[random.randint(0,num_vals - 1)] += 1

plt.bar(np.arange(23), results)

enter image description here

Здесь наиболее выбранное значение выбиралось в 10 раз чаще, чем наименее выбранное значение.Запустите то же самое, но измените num_samples на 10000, и оно станет более равномерным (как и следовало ожидать).

enter image description here

Так что это былоодин эксперимент с этими значениями ... если я запускаю вашу установку (78 выборок из 23) 10 000 раз, она всегда имеет сильно искаженную частоту выборки.

num_vals = 23
num_samples = 78
num_tests = 10000

max_minus_min = []

for j in range(num_tests):

    results = [0] * num_vals

    for i in range(num_samples):
        results[random.randint(0,num_vals - 1)] += 1

    max_minus_min.append(max(results) - min(results))

plt.hist(max_minus_min, bins=25)

Более 1/3 из 10 000 имитаций имелиmax - min> = 8, поэтому я не думаю, что ваши результаты выглядят такими аномальными.

enter image description here

0 голосов
/ 01 марта 2019

У вас возникнет проблема не с AWS Lambda, а с библиотекой Math.random.См. Также this и this связанный вопрос переполнения стека.Рассмотрим Википедию для введения в теорию генерации случайных чисел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...