Python时间函数不一致性

Python时间函数不一致性,python,Python,我被分配了一个任务,我必须创建两个小函数,以相同的机会给出“正面”或“反面”,类似地,用6张脸掷骰子,1,2,3,4,5或6 重要提示:我无法在此任务中使用randint或类似函数 所以我创建了这两个函数,它们利用python库中的time(毫秒的第一位)函数生成一个“伪随机数”: import time def dice(): ctrl = False while ctrl == False: m = lambda: int(round(time.ti

我被分配了一个任务,我必须创建两个小函数,以相同的机会给出“正面”或“反面”,类似地,用6张脸掷骰子,1,2,3,4,5或6

重要提示:我无法在此任务中使用randint或类似函数

所以我创建了这两个函数,它们利用python库中的time(毫秒的第一位)函数生成一个“伪随机数”:

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)
然而,我观察到一种倾向,即在“头”上加上“尾”,因此我创建了一个函数来测试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))
试验结果为(多次):

所以我对骰子函数做了同样的事情,结果是:

1:20 2:20 3:10 4:20 5:10 6:20
因此,正如您所看到的,由于某些原因,我无法推断-如果是由于我的错误或其他原因-时间函数有一个趋势,即给出较少的“3”和“5”,并且再次运行测试,使用所有数字(包括0、7、8和9),我已经看到这种趋势扩展到“0”和“7”

如能就此事提出一些见解和意见,我将不胜感激

编辑:


m=lambda:int(round(time.time()*1000))中删除round()函数
函数解决了问题-正如Makoto所回答的那样。

使用
意味着,如果从基于时间的随机操作中获得的值彼此之间的距离相等(即,您“翻转”),您的硬币翻转函数将趋向于偶数由于您的计算机内部结构,您的硬币每半秒就更加稳定)

:

对于支持
round()
的内置类型,将值四舍五入到最接近幂减去ndigit的10倍;如果两个倍数相等接近,则向偶数选择进行舍入(例如,
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']

您可以做的唯一现实的事情是,如果值彼此足够接近,则重新生成时间样本,这样您就不会遇到这样的基于时间的偏差,或者生成十个时间样本,然后取它们的平均值。原则上,如果您的计算机运行速度足够快,并且执行这些功能的速度足够快,它可能会拉取相同的时间戳,这将导致强烈的基于时间的偏差。

100模拟对于此类测试来说是不够大的样本量。为什么不运行100000多个模拟,看看结果如何不同呢?
56
44
在统计上真的有显著差异吗?可能是一个不太可能的结果与一个公平的硬币?对于骰子值也是如此。使用更大的样本量,然后进行一些静态模拟。我已经进行了更多的模拟(10000+),结果也有相同的趋势(在其他数字中,小于0,3,5,7:~650,大于1250)。克里斯·兰兹:我决不会在硬币上用+10%的几率来表示头部,很可能是
time.time()
精确返回
.5
?当然这(几乎)永远不会发生?谢谢!我从算法中删除了round()函数,这就完成了!现在的测试结果几乎是50/50,各不相同:
尾巴:45个头:55
<代码>尾部:54个头部:46个<代码>尾部:49个头部:51。这毕竟是我的错误。
>>> [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']