生成没有上限的随机整数
Generate random integer without an upper bound
我想以可预测的方式生成随机 种子。
我希望这样做
seed = 12345
prng_0 = random.Random(seed)
prng_1 = random.Random(prng_0.rand_int(0))
那里,0
是下界,但事实证明我还需要给它一个上限。我不想设置固定的上限。
如果你对我的理由感到好奇,我这样做是因为我在测试时需要可重复性。也就是说,这是一个接收种子并构建其 prng 的函数,prng_0
,然后多次调用另一个函数,每次都需要接收不同的种子。
def funct_a(seed=None):
prng_1 = random.Random(seed)
prng_2 = numpy.random.RandomState(prng_1.randint(0, 4294967296))
print(prng_1.random())
print(prng_2.random())
def funct_b(seed=None):
prng_0 = random.Random(seed)
for i in range(0, 5):
seed = prng_0.randint(0) # not working, needs upper bound
funct_a(seed)
funct_b(12345) # test call
编辑:有趣的是,numpy(我也在使用)有一个确定的上种子值,doc 和这个错误
证明了这一点
ValueError: Seed must be between 0 and 4294967295
你无法避免上限。如果没有代码,代码将如何工作?这就是代码在 x
和 y
之间生成随机数的方式:
0______________________________________________r__________________________________________1
r
是0
和1
之间的随机小数。这是用固定算法生成的。
然后,它需要 r
并将其乘以上限减去下限。这几乎意味着 0
变为 x
,而 1
变为 y
。如果rand
是随机数,r : (1 - 0) :: rand : (y - x)
编辑:实际上是一种生成没有上限的随机数的方法,但它不是对数的,也不是统一的分散式。看看这个 python 算法:
import random
def randint():
i = 0
while True:
if random.random() < 0.5: # Or whatever other probability you want
return i
else:
i += 1
差不多,这是在做从零开始,然后每次都有0.5的概率返回那个数;否则它会继续。
这意味着它有 0.5 的概率为 0,25% 为 1,12.5% 为 2,5.25% 为 3,等等。这是对数分布 "without an upper bound"。
当我不想要上限时,我通常会使用 sys.maxint
作为上限作为近似值
我想以可预测的方式生成随机 种子。
我希望这样做
seed = 12345
prng_0 = random.Random(seed)
prng_1 = random.Random(prng_0.rand_int(0))
那里,0
是下界,但事实证明我还需要给它一个上限。我不想设置固定的上限。
如果你对我的理由感到好奇,我这样做是因为我在测试时需要可重复性。也就是说,这是一个接收种子并构建其 prng 的函数,prng_0
,然后多次调用另一个函数,每次都需要接收不同的种子。
def funct_a(seed=None):
prng_1 = random.Random(seed)
prng_2 = numpy.random.RandomState(prng_1.randint(0, 4294967296))
print(prng_1.random())
print(prng_2.random())
def funct_b(seed=None):
prng_0 = random.Random(seed)
for i in range(0, 5):
seed = prng_0.randint(0) # not working, needs upper bound
funct_a(seed)
funct_b(12345) # test call
编辑:有趣的是,numpy(我也在使用)有一个确定的上种子值,doc 和这个错误
证明了这一点ValueError: Seed must be between 0 and 4294967295
你无法避免上限。如果没有代码,代码将如何工作?这就是代码在 x
和 y
之间生成随机数的方式:
0______________________________________________r__________________________________________1
r
是0
和1
之间的随机小数。这是用固定算法生成的。
然后,它需要 r
并将其乘以上限减去下限。这几乎意味着 0
变为 x
,而 1
变为 y
。如果rand
是随机数,r : (1 - 0) :: rand : (y - x)
编辑:实际上是一种生成没有上限的随机数的方法,但它不是对数的,也不是统一的分散式。看看这个 python 算法:
import random
def randint():
i = 0
while True:
if random.random() < 0.5: # Or whatever other probability you want
return i
else:
i += 1
差不多,这是在做从零开始,然后每次都有0.5的概率返回那个数;否则它会继续。
这意味着它有 0.5 的概率为 0,25% 为 1,12.5% 为 2,5.25% 为 3,等等。这是对数分布 "without an upper bound"。
当我不想要上限时,我通常会使用 sys.maxint
作为上限作为近似值