AWS Lambda不擅长生成随机数吗?

时间:2019-02-28 23:58:30

标签: aws-lambda

我有一个Lambda函数,该函数会在每次调用时生成一个从0到22的随机数。但是,我不觉得这个数字是真正随机的,因为当我多次快速运行该函数时,我经常会连续获得相同的数字。

运行时间为nodejs8.10,我只是在调用Math.floor(23*Math.random())来生成数字。

要对此进行调试,我在大约20分钟的时间内运行了该函数78次,从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 :(得分:3)

我认为这些值看起来不是随机的。

如果 WERE 始终如一,那么从23个值中抽取78个样本可能会令人怀疑。如果统一,则从23个值中抽取100,000个样本似乎很可疑。

在python中进行仿真以进行演示。

您当前的设置(23个值的78个样本):

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更改为10,000,显然它将变得更加统一(就像您期望的那样)。

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)

在10,000个模拟中,有超过1/3的max - min> = 8,所以我认为您的结果看起来并不异常。

enter image description here

答案 1 :(得分:1)

您可能遇到的问题不是AWS Lambda,而是Math.random库。另请参阅thisthis相关的堆栈溢出问题。考虑Wikipedia作为随机数生成理论的介绍。