我已经完成了一项任务,因为我必须创建两个小功能,这些功能可以平等地提供,并且#34; head"或者"尾巴"与6面投掷的骰子相似,1,2,3,4,5或6。
重要提示:我无法使用randint或类似功能进行此分配。
因此,我创建了这两个生成“伪随机数”的函数。利用python库中的时间(毫秒的第一个数字)函数:
import time
def dice():
ctrl = False
while ctrl == False:
m = lambda: int(round(time.time() * 1000))
f = m()
d = abs(f) % 10
if d in range(1,7):
return d
ctrl = True
def coin():
m = lambda: int(round(time.time() * 1000))
f = m()
if f % 2 == 0:
return "Tails"
elif f == 0:
return "Tails"
else:
return "Heads" (EDIT: I don't know why i typed "Dimes" before)
然而,我发现了一种倾向于提供“尾巴”的倾向。因为我已经创建了一个功能来测试“尾巴”的百分比'和' Heads'投掷100次:
def _test():
ta = 0
he = 0
x = 100
while x > 0:
c = coin()
if c == "Tails":
ta += 1
else:
he += 1
x -= 1
time.sleep(0.001)
print("Tails:%s Heads:%s" % (ta, he))
测试结果是(好几次):
Tails:56 Heads:44
所以我用骰子功能做了同样的事情,结果是:
1:20 2:20 3:10 4:20 5:10 6:20
所以,正如你所看到的,由于某些原因,我无法推断 - 如果是由于我或其他原因的某些错误 - 时间函数倾向于给予更少的' 3'并且' 5'并再次运行测试所有数字(包括零,七,八和九)我已经看到这种趋势延伸到' 0'和' 7'。
我很感激有关此事的一些见解和意见。
编辑:
从m = lambda: int(round(time.time() * 1000))
函数中删除round()函数解决了问题 - 正如Makoto的回答。
答案 0 :(得分:2)
您对round
的使用意味着如果您从基于时间的随机操作获得的值彼此等距(即您每次更“一致地”翻转)您的硬币翻转功能将倾向于均数由于你的计算机内部原因,半秒钟。)
对于支持
round()
的内置类型,值会四舍五入到10的最接近倍数,而不是 ndigits ;如果两个倍数相等,则向均匀选择进行舍入(例如,round(0.5)
和round(-0.5)
都为0,round(1.5)
为2)。
看来你的两种方法都受到这种偏见的影响;如果它们在一个接一个地执行得太快,或者太接近一个时间戳,那么你可能倾向于从中得到一个值:
>>> [dice() for x in range(11)]
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
>>> [coin() for x in range(11)]
['Dimes', 'Dimes', 'Dimes', 'Dimes', 'Dimes', 'Dimes', 'Dimes', 'Dimes', 'Dimes', 'Dimes', 'Dimes']
你可以做的唯一现实的事情是,如果值彼此足够接近,则重新生成时间样本,这样就不会遇到像这样的基于时间的偏差,或者生成十次样本并取平均值而那些。原则上,如果您的计算机移动得足够快并且足够快地执行这些功能, 可能会拉出相同的时间戳,这将导致强烈的基于时间的偏差。