Python时间函数不一致

时间:2016-10-10 14:36:21

标签: python

我已经完成了一项任务,因为我必须创建两个小功能,这些功能可以平等地提供,并且#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的回答。

1 个答案:

答案 0 :(得分:2)

您对round的使用意味着如果您从基于时间的随机操作获得的值彼此等距(即您每次更“一致地”翻转)您的硬币翻转功能将倾向于均数由于你的计算机内部原因,半秒钟。)

From the documentation

  

对于支持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']

你可以做的唯一现实的事情是,如果值彼此足够接近,则重新生成时间样本,这样就不会遇到像这样的基于时间的偏差,或者生成十次样本并取平均值而那些。原则上,如果您的计算机移动得足够快并且足够快地执行这些功能, 可能会拉出相同的时间戳,这将导致强烈的基于时间的偏差。