我有一个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中是否存在随机性陷阱?我可以做些事情来获得更多随机数吗?
答案 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)
在这里,最高采样值的选择频率比最低采样值高10倍。运行相同的操作,但是将num_samples
更改为10,000,显然它将变得更加统一(就像您期望的那样)。
这是使用这些值进行的一项实验...如果我将您的设置(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,所以我认为您的结果看起来并不异常。
答案 1 :(得分:1)