奇怪的python行为随机

时间:2016-06-23 15:28:39

标签: python python-2.7 random

这个小脚本在0和1之间生成一个随机浮动,然后如果它小于“0.000111111111111”,它将打印消息“找到它”

import random

value = 0.4 / 3600
print value

while True:
    rand = random.random()

    print "RAND IS: " + str(rand) + "----- VAL IS " + str(value)
    if rand < value:
        print "found it"

所以看起来脚本运行并且它实际上从未“找到它”,但是当我在if语句之前注释掉print语句时,即使rand值不小于值,命令行仍然填充“找到它” 。怎么了?

2 个答案:

答案 0 :(得分:3)

您的while循环旨在永远运行,因为task始终为True。你永远不会打破那无限循环。即使它找到了值,它也只是打印它,因为你给while循环的条件仍然是True。由于您无法更改条件,因此需要添加break语句:

True

答案 1 :(得分:2)

您的程序确实会找到小于和大于&#39;值&#39;的数字,无论它是否打印出所有数字。只是输出双向让你感到困惑。这是因为:(a)你的计算机比你想象的更快,只要它不打印任何东西; (b)但当 必须打印某些内容时,它会减慢到可以实际看到打印输出的程度; (c)成功&#34;发现之间的迭代次数&#34;比你想象的要大。

为了演示以上所有内容,我写了这个脚本:

Sheet.Range()

这会产生随机数,直到找到一个小于&#34;值&#34;,然后它会写出循环迭代次数和经过的CPU时间来找到它。它做了十万次。在我的计算机上,这个旧的但 旧的,这个程序花了六秒来运行。

然后我绘制了两者的直方图。首先,让我们看一下循环次数:

Histogram of number of loops needed to find a small random number, with inset zoom-in on the range 0...20000

你可以看到,虽然通常只需要几千次迭代就能找到一个小于0.4 / 3600的随机数,但它可以多达80,000次迭代!这就是为什么它可能在你看来&#34;发现它&#34;从未被打印过。

现在让我们看一下经过的时间:

Histogram of CPU time in milliseconds needed to find a small random number

它看起来非常类似于循环次数的直方图,但请注意X轴刻度。该时间为毫秒。即使需要80,000次迭代才能找到小于0.4 / 3600的下一个数字,它只需要计算机 4毫秒来完成这一壮举!这就是为什么在你看来&#34;发现它&#34;当您注释掉每次打印输出时连续打印。