使用python

时间:2016-09-27 00:29:19

标签: python random

我正在寻找创建随机数,因为我不能使用random库。基本上我希望能够使用纯python复制random.randint()random.random()方法。

我不希望任何人在python中转储整个代码(尽管那会很棒),但是有人可以引用我一个类似的C / C ++ / Java算法,可以很容易地复制到python中吗?

编辑:我正在寻找有关如何使用python代码创建随机数的参考资料,而不是我自己不应该这样做的原因,并找到在任何地方使用randomnumpy.random的方法成本

2 个答案:

答案 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.randomrandom.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,然后使用它来实现randrangerandint等,就像Python一样。