在(几乎)int64允许的整个间隔内生成随机整数时,生成的整数似乎在较小的范围内生成。我正在使用以下代码:
import numpy
def randGenerationTest(n_gens=100000):
min_int = 2**63
max_int = 0
for _ in range(n_gens) :
randMatrix = numpy.random.randint(low=1, high = 2**63, size=(1000,1000))
a = randMatrix.min()
b = randMatrix.max()
if a < min_int:
min_int = a
if b > max_int :
max_int = b
return min_int, max_int
哪个返回以下内容:
randomGenerationTest()
>>> (146746577, 9223372036832037133)
我同意[1,146746577]只是我要获取的全部范围的一小部分,但是在1e11范围为[1,2 ^ 63)的随机整数中,我应该只是一旦接近我的边界? 使用太大的间隔时,这是预期的行为吗? 还是作为一个人,我无法理解这些间隔有多大,而我已经“足够近”了?
顺便说一句,这只是想知道是否可以将Seed随机设置为1到1e63,因为可以将其手动设置为任何这些值。
答案 0 :(得分:1)
您正在生成10 ^ 3 * 10 ^ 3 * 10 ^ 5 = 10 ^ 11的值。 2 ^ 63/10 ^ 11〜= 10e + 08。您甚至没有接近填充值的空间。粗略计算一下,如果您要对一个均匀空间的1/10 ^ n个元素进行采样,那么从最大和最小元素开始,样本的最小和最大值约为n个数量级,这似乎是很合理的。
答案 1 :(得分:1)
最大差到间隔9223372036832037133
的上边界的数字2**63 - 1
是22738674
。这仅占整个范围的2.46e-12
。分钟也是如此。值146746577
,相对于整个间隔范围,它与下边界的距离约为1.59e-11
。这意味着您覆盖了该间隔范围的99.999999999%以上,即几乎所有内容。