随机选择一个 5 位数字和单独选择每个数字有什么区别?
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)
是,不是,不是。
是:概率相乘,所以数字序列具有相同的概率
概率(a)和概率(b)=概率(a)*概率(b)
由于每个数字有 0.1 次出现的机会,因此两个特定数字按顺序排列的概率为 0.1**2,即 0.01,即 0 到 99 之间的数字出现的概率。
否:您的第二个数字有错字。
第二种形式只有四位数字;你可能是说 randrange(0, 100000)
否:输出不会相同
第二种形式不会打印前导数字;您可以 print("%05d"%x) 获取所有数字。此外,第一种形式在输出中有空格,因此您可以改为 print("%d%d%d%d%d"%(a,b,c,d,e)).
与一次数字方法的实用性和可维护性缺点相比,任何随机数生成器差异(如果有的话——请参阅随机性部分)都是微不足道的。
对于初学者来说,生成每个数字需要更多的代码来处理完全正常的调用,例如 randrange(0, 1024)
或 randrange(0, 2**32)
,其中数字 而不是 以等概率出现。例如,在closed-closed range [0,1023](需要4位)上,四位中的第一位可以never是0或1以外的任何值。最后一位是更可能是 0、1、2 或 3。依此类推。
试图覆盖所有的基础会很快使代码变得更慢、更容易出错并且比现在更脆弱。 (您在发布此问题时遇到的烦人小细节的数量应该让您了解该路径的更深处。)
...所有的悲伤都是之前你考虑random.randrange
处理非零start
值是多么容易,step
参数和负参数。
随机性问题
如果您的 RNG 很好,您的替代方法应该会产生 "equally random" 个结果(假设您已经解决了我上面提到的所有问题)。 但是,如果您的 RNG 有偏差,那么一次一个数字的方法可能会增加其对输出的影响。
出于演示目的,假设您的偏向荒谬的 RNG 存在差一错误,因此它从不 产生给定范围的最后一个值:
调用 randrange(0, 2**32)
永远不会产生 2**32 - 1
(4,294,967,295),但其余 40 亿以上的值将以非常接近预期的概率出现。它经过数百万次调用的输出很难与工作的伪随机数生成器区分开来。
单独生成同一个假定随机数的十位数字将使 每个 数字出现相同的差一错误,导致十位-digit 输出,完全由数字 [0,8] 组成,不存在 9...ever。这比一次生成整数要 "less random" 多得多。
相反,一次一个数字的方法永远不会比支持它的 RNG 更好,即使请求的范围非常小。该方法可能会放大任何 RNG 偏差,或者只是重复该偏差,但它永远不会减少它。
使用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)
是,不是,不是。
是:概率相乘,所以数字序列具有相同的概率
概率(a)和概率(b)=概率(a)*概率(b)
由于每个数字有 0.1 次出现的机会,因此两个特定数字按顺序排列的概率为 0.1**2,即 0.01,即 0 到 99 之间的数字出现的概率。
否:您的第二个数字有错字。
第二种形式只有四位数字;你可能是说 randrange(0, 100000)
否:输出不会相同
第二种形式不会打印前导数字;您可以 print("%05d"%x) 获取所有数字。此外,第一种形式在输出中有空格,因此您可以改为 print("%d%d%d%d%d"%(a,b,c,d,e)).
与一次数字方法的实用性和可维护性缺点相比,任何随机数生成器差异(如果有的话——请参阅随机性部分)都是微不足道的。
对于初学者来说,生成每个数字需要更多的代码来处理完全正常的调用,例如 randrange(0, 1024)
或 randrange(0, 2**32)
,其中数字 而不是 以等概率出现。例如,在closed-closed range [0,1023](需要4位)上,四位中的第一位可以never是0或1以外的任何值。最后一位是更可能是 0、1、2 或 3。依此类推。
试图覆盖所有的基础会很快使代码变得更慢、更容易出错并且比现在更脆弱。 (您在发布此问题时遇到的烦人小细节的数量应该让您了解该路径的更深处。)
...所有的悲伤都是之前你考虑random.randrange
处理非零start
值是多么容易,step
参数和负参数。
随机性问题
如果您的 RNG 很好,您的替代方法应该会产生 "equally random" 个结果(假设您已经解决了我上面提到的所有问题)。 但是,如果您的 RNG 有偏差,那么一次一个数字的方法可能会增加其对输出的影响。
出于演示目的,假设您的偏向荒谬的 RNG 存在差一错误,因此它从不 产生给定范围的最后一个值:
调用
randrange(0, 2**32)
永远不会产生2**32 - 1
(4,294,967,295),但其余 40 亿以上的值将以非常接近预期的概率出现。它经过数百万次调用的输出很难与工作的伪随机数生成器区分开来。单独生成同一个假定随机数的十位数字将使 每个 数字出现相同的差一错误,导致十位-digit 输出,完全由数字 [0,8] 组成,不存在 9...ever。这比一次生成整数要 "less random" 多得多。
相反,一次一个数字的方法永远不会比支持它的 RNG 更好,即使请求的范围非常小。该方法可能会放大任何 RNG 偏差,或者只是重复该偏差,但它永远不会减少它。