我想在a和之间选择一个随机整数b.
我知道3种方法.但是,他们的表现似乎非常违反直觉:
import timeit
t1 = timeit.timeit("n=random.randint(0, 2)", setup="import random", number=100000)
t2 = timeit.timeit("n=random.choice([0, 1, 2])", setup="import random", number=100000)
t3 = timeit.timeit("n=random.choice(ar)", setup="import random; ar = [0, 1, 2]", number=100000)
[print(t) for t in [t1, t2, t3]]
Run Code Online (Sandbox Code Playgroud)
在我的机器上,这给出了:
0.29744589625620965
0.19716156798482648
0.17500512311108346
Run Code Online (Sandbox Code Playgroud)
使用在线翻译,这给出:
0.23830216699570883
0.16536146598809864
0.15081614299560897
Run Code Online (Sandbox Code Playgroud)
注意使用专用函数执行我正在做的事情的最直接版本(#1)比预先定义数组然后从中随机选择的最奇怪版本(#3)差50%.
这是怎么回事?
所以我正在测试计算游戏中某些骰子掷骰的概率.如果滚动的10面死的基本情况.
我做了一百万个这样的样本,结果是以下比例:
Result
0 0.000000000000000%
1 10.038789961210000%
2 10.043589956410000%
3 9.994890005110000%
4 10.025289974710000%
5 9.948090051909950%
6 9.965590034409970%
7 9.990190009809990%
8 9.985490014509990%
9 9.980390019609980%
10 10.027589972410000%
Run Code Online (Sandbox Code Playgroud)
这些当然应该都是10%.这些结果的标准偏差为0.0323207%.对我来说,这似乎相当高.这只是巧合吗?据我了解,随机模块访问适当的伪随机数.即通过统计测试的方法是随机的.或者是这些伪伪随机数生成器
我应该使用加密伪随机数生成器吗?我相当肯定,我并不需要一个真正的随机数发生器(见http://www.random.org/,http://en.wikipedia.org/wiki/Hardware_random_number_generator).
我目前正在用10亿个样本重新生成我的所有结果,(为什么不,我有一个脆弱的服务器供我使用,还有一些睡觉要做)