2

我正在使用Trypython.org,发现没有包含随机模块,所以很好奇。

是否有另一种方法可以在不导入随机数的情况下生成一定范围内的随机数?

4

5 回答 5

2

随机数生成并不难。困难的是发明自己的方法并找到证明它很好的证据,或者编写优化的/安全的/线程安全的/.../ 实现。

这是我在http://en.wikipedia.org/wiki/Random_number_generation#Computational_methods中描述的乘法进位方法的 Python 版本

通过调用 getuniform(),您将获得介于 0 和 1 之间的非常好的和均匀的随机数,然后将它们缩放到您需要的大小。除了密码学或详细的蒙特卡洛模拟之外,这对于大多数情况应该没问题。

class myrandom:
    kz=36969
    kw=18000
    k3=65535
    maxz=kz*k3+(2<<16)
    maxw=kw*k3+(2<<16)
    max=(maxz<<16 )+maxw
    # Optionally initiate with different seed. Two numbers below 2<<16
    def __init__(self,z=123456789,w=98764321):
        self.m_w = w
        self.m_z = z
    def step(self):
        self.m_z = self.kz * (self.m_z & self.k3) + (self.m_z >> 16)  
        self.m_w = self.kw * (self.m_w & self.k3) + (self.m_w >> 16)       
    def get(self):
        self.step()
        return (self.m_z << 16) + self.m_w
    def time_reseed(self):
        # yes, sure, move out import if you like to
        import time
        t=int(time.time())
        # completely made up way to got two new numbers below 2<<16
        self.m_z = (self.m_z+(t*34567891011)) & ((2<<16)-1)
        self.m_w = (self.m_w+(t*10987654321)) & ((2<<16)-1)
        self.step()
    def getuniform(self):
        return self.get()*1.0/self.max

例子:

myr=myrandom()
print [myr.getuniform() for x in range(20)]

如果你调用 time_reseed() 一些来自 time() 的新随机性被添加到状态中。

于 2012-06-07T12:09:04.653 回答
2

它非常丑陋,不可靠,而且速度不是很快,但它确实有效:

>>> import time
>>> t = time.time()
>>> int(str(t-int(t))[2:])%100 #Keeping only the numbers after the decimal point, otherwise you would get the same "random" number each second
33

这里的范围是 [0,99](参见模 100)。需要您自担风险使用它。

于 2012-06-07T11:07:12.607 回答
2

生成随机数,或者更确切地说是伪随机数是一项棘手的工作,最好坚持使用默认库。我建议您硬着头皮下载 Python 2.7.23.2.3,然后您也可以使用 trypython 未包含的任何其他库。

于 2012-06-07T11:02:04.200 回答
2

随机性不是一个微不足道的主题,因此我建议不要使用替代模块,而是建议使用替代在线 IDE。

看看pythonfiddle。这是您应该在那里使用的代码:

import random
print random.randint(1, 100)
于 2012-06-07T11:38:58.550 回答
0

使用“秘密”模块 - 它是一个内置模块:import secrets secrets.random(10) 它会生成一个介于 0 到 10 之间的数字或您的值!

于 2020-04-03T06:30:03.323 回答