我正在寻找创建随机数,因为我不能使用random
库。基本上我希望能够使用纯python复制random.randint()
和random.random()
方法。
我不希望任何人在python中转储整个代码(尽管那会很棒),但是有人可以引用我一个类似的C / C ++ / Java算法,可以很容易地复制到python中吗?
编辑:我正在寻找有关如何使用python代码创建随机数的参考资料,而不是我自己不应该这样做的原因,并找到在任何地方使用random
或numpy.random
的方法成本
答案 0 :(得分:4)
由于您被迫使用在线IDE,我将假设这是课程工作,您不需要最新,最好,最可靠的随机数生成器。相反,你只需要一些足以完成短暂课堂作业的东西。
如果是这种情况,生成随机数的常用算法是线性同余生成器。使用典型参数:
>>> def r(seed=[0], m=2**32, a=1664525, c=1013904223):
... seed[0] = (a*seed[0] + c) % m
... return seed[0]
...
该算法返回从0到(2 ** 32)-1的随机整数。
以下是一些示例结果:
>>> r()
1013904223
>>> r()
1196435762
>>> r()
3519870697
您可以阅读有关此算法的更多信息here。
除非您更改种子,否则此算法将始终从定义函数后的同一点开始。
同样,这不适用于结果质量很重要的认真工作。
random.random
和random.randint
要在0到1之间返回“随机”数字[0,1)
,并使用上述函数r
:
def random():
return r() / 2**32
同样适用于random.randint
:
def randint(a, b):
return int(a + (1 + b - a) * r() / 2**32)
如果m
中的r
值发生了变化,那么此处也应更改2**32
。
答案 1 :(得分:0)
如果您无法使用random
,但可以使用os
,则可以始终使用os.urandom
获取随机字节,然后根据需要进行转换。
例如,使用os.urandom
,实现random.random
&#39}是微不足道的
行为(事实上,random.SystemRandom
implements it precisely this way):
import os
BPF = 53 # Bit per float
RECIP_BPF = 2**-BPF
def random():
return (int.from_bytes(os.urandom(7), 'big') >> 3) * RECIP_BPF
如果您点击关于的源链接,您会注意到random.SystemRandom
实际上只实现了几种方法,因为"核心"功能,其余的实现都是从常规random.Random
类中借用的;您可以随时借用getrandbits
SystemRandom
,然后使用它来实现randrange
,randint
等,就像Python一样。