我使用Trypython.org,发现没有随机模块,所以很好奇。
是否有另一种方法可以在一定范围内生成随机数而无需随机导入?
答案 0 :(得分:3)
它非常丑陋,不可靠,并且不是很快,但它有效:
>>> 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)。 使用它需要您自担风险。
答案 1 :(得分:2)
答案 2 :(得分:2)
随机性不是一个微不足道的主题,因此我建议使用另一种在线IDE而不是替代模块。
看看pythonfiddle。以下是您应该在那里使用的代码:
import random
print random.randint(1, 100)
答案 3 :(得分:2)
随机数生成不一定很难。发明自己的方法并找到好的证据,或者编写优化的/安全的/线程安全的/.../实现是很困难的。
这是我的Python版本的Multiply-with-carry方法,如下所述 http://en.wikipedia.org/wiki/Random_number_generation#Computational_methods
通过调用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()开始的一些新随机性就会被添加到状态中。
答案 4 :(得分:0)
使用“秘密”模块-这是一个内置模块: 进口机密 secrets.random(10) 它会产生0到10或您输入的数值之间的数字!