[英]What's the difference between randomly picking a 5-digit number, and picking each digit individually?
使用random.randrange
分别选择5位数之间有什么区别,如下所示:
a=random.randrange(0,10)
b=random.randrange(0,10)
c=random.randrange(0,10)
d=random.randrange(0,10)
e=random.randrange(0,10)
print (a,b,c,d,e)
...并一次选择5位数字,如下所示:
x=random.randrange(0, 100000)
print (x)
是的,不,不。
是:概率乘以,因此数字序列具有相同的概率
prob(a)和prob(b)= prob(a)* prob(b)
由于每个数字的出现概率为0.1,因此按顺序排列的两个特定数字的概率为0.1 ** 2或0.01,这是0到99之间的数字概率。
不:你的第二个号码有拼写错误。
第二种形式只有四位数字; 你可能意味着randrange(0,100000)
不:输出不一样
第二种形式不会打印前导数字; 你可以打印(“%05d”%x)来获取所有数字。 此外,第一种形式在输出中有空格,因此您可以改为打印(“%d%d%d%d%d”%(a,b,c,d,e))。
与一次数字方法的效用和可维护性缺点相比,任何随机数发生器差异(如果有的话 - 参见随机性部分)都是微不足道的。
对于初学者来说,生成每个数字需要更多的代码来处理完全正常的调用,如randrange(0, 1024)
randrange(0, 2**32)
randrange(0, 1024)
或randrange(0, 2**32)
,其中数字不会以相同的概率出现。 例如,在闭合闭合范围[0,1023](需要4位数)上,四个中的第一个数字永远不能是0或1以外的任何数字。最后一个数字稍微更可能是0,1, 2,或3.依此类推。
试图覆盖所有基础将迅速使代码更慢,更容易出错,并且比现在更脆弱。 (你在发布这个问题时遇到的令人讨厌的小细节的数量应该可以让你知道在那条路上走得更远的地方。)
......和所有的悲伤是你考虑如何轻松地前 random.randrange
处理非零start
值,在step
参数,负参数。
如果你的RNG是好的,你的替代方法应该产生“同等随机”的结果(假设你已经处理了我上面提到的所有问题)。 但是 ,如果您的RNG存在偏差,那么一次数字方法可能会增加其对输出的影响。
出于演示目的,假设您的荒谬偏向RNG具有一个一个一个错误,因此它永远不会产生给定范围的最后一个值:
调用randrange(0, 2**32)
将永远不会产生2**32 - 1
(4,294,967,295),但剩余的40亿以上的值将以非常接近的预期概率出现。 它在数百万次调用中的输出很难与工作的伪随机数发生器区分开来。
分别产生相同的所谓随机数的十位数将使每个数字受到相同的逐个错误,导致十位输出完全由数字[0,8]组成,没有9s存在。 .. 永远 。 这比一次生成整数更“随机”。
相反,即使请求的范围非常小,一次数字方法永远不会比支持它的RNG 更好 。 这种方法可能会放大任何RNG偏差,或只是重复这种偏见,但它永远不会减少它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.