Python 不使用随机模块的随机函数
Python Random Function without using random module
我需要编写函数 -
random_number(minimum,maximum)
在不使用随机模块的情况下,我这样做了:
import time
def random_number(minimum,maximum):
now = str(time.clock())
rnd = float(now[::-1][:3:])/1000
return minimum + rnd*(maximum-minimum)
我不确定这是否合适..有没有已知的方法可以节省时间?
是否允许读取某些特殊文件中的随机数据?在 Linux 下,文件 `/dev/urandom' 提供了一种获取随机字节的便捷方法。你可以这样写:
import struct
f = open("/dev/urandom","r")
n = struct.unpack("i",f.read(4))[0]
但这在 Windows 下不起作用。
使用API?如果允许的话。
import urllib2
def get_random(x,y):
url = 'http://www.random.org/integers/?num=1&min=[min]&max=[max]&col=1&base=10&format=plain&rnd=new'
url = url.replace("[min]", str(x))
url = url.replace("[max]", str(y))
response = urllib2.urlopen(url)
num = response.read()
return num.strip()
print get_random(1,1000)
The thing is I need to do something that somehow uses the time
您可以根据 clock drift:
生成随机数
import struct
import time
def lastbit(f):
return struct.pack('!f', f)[-1] & 1
def getrandbits(k):
"Return k random bits using a relative drift of two clocks."
# assume time.sleep() and time.clock() use different clocks
# though it might work even if they use the same clock
#XXX it does not produce "good" random bits, see below for details
result = 0
for _ in range(k):
time.sleep(0)
result <<= 1
result |= lastbit(time.clock())
return result
一旦你有了 getrandbits(k)
,就可以直接得到范围 [a, b] 内的随机整数,包括两个端点。 Based on CPython Lib/random.py:
def randint(a, b):
"Return random integer in range [a, b], including both end points."
return a + randbelow(b - a + 1)
def randbelow(n):
"Return a random int in the range [0,n). Raises ValueError if n<=0."
# from Lib/random.py
if n <= 0:
raise ValueError
k = n.bit_length() # don't use (n-1) here because n can be 1
r = getrandbits(k) # 0 <= r < 2**k
while r >= n: # avoid skew
r = getrandbits(k)
return r
例如,生成 20 个从 10 到 110 的随机数,包括:
print(*[randint(10, 110) for _ in range(20)])
输出:
11 76 66 58 107 102 73 81 16 58 43 107 108 98 17 58 18 107 107 77
如果 getrandbits(k)
returns k
随机位,那么 randint(a, b)
应该按原样工作(没有因模数等原因造成的偏差)。
要测试 getrandbits(k)
的质量,可以使用 dieharder
实用程序:
$ python3 random-from-time.py | dieharder -a -g 200
其中 random-from-time.py
生成无限(随机)二进制流:
#!/usr/bin/env python3
def write_random_binary_stream(write):
while True:
write(getrandbits(32).to_bytes(4, 'big'))
if __name__ == "__main__":
import sys
write_random_binary_stream(sys.stdout.buffer.write)
其中 getrandbits(k)
定义如上。
以上假定您不允许使用os.urandom()
或ssl.RAND_bytes()
,或一些已知的PRNG算法如Mersenne Twister来实现getrandbits(k)
.
使用“time.sleep()
+ time.clock()
”实现的 getrandbits(n)
未通过 dieharder
测试(太多不是巧合)。
这个想法仍然合理:时钟漂移可以用作随机性(熵)的来源,但您不能直接使用它(分布不均匀 and/or 某些位是相关的);这些位可以作为种子传递给接受任意熵源的 PRNG。参见 "Mixing" section。
想法是使用时间模块获取 0 和 1 之间的数字,并使用它来获取 range.Following 中的数字将在 20 和 60 范围内随机打印 20 个数字
from time import time
def time_random():
return time() - float(str(time()).split('.')[0])
def gen_random_range(min, max):
return int(time_random() * (max - min) + min)
if __name__ == '__main__':
for i in range(20):
print gen_random_range(20,60)
这里我们需要了解一件事
使用 random 生成随机变量
在 运行 时间给出的值。为此我们需要
时间模块
time.time() 给你随机值(数字接近 17)。
我们需要以毫秒为单位,所以我们需要乘以 1000
如果我需要 0-10 的值
那么我们需要得到小于 10 的值,这意味着我们需要以下内容:
time.time%10(但它是浮点数我们需要转换成整数)
整数(time.time%10)
import time
def rand_val(x):
random=int(time.time()*1000)
random %= x
return random
x=int(input())
print(rand_val(x))
找到范围 (x,y) 之间的随机值
您需要在 x
处从高存储中减去低范围
然后从0-x随机找
然后将值加到low range-> lowrange+x(x是随机的)
import time
def rand_val(x,y):
sub=y-x
random=int(time.time()*1000)
random %=sub
random+=x
return random
x=int(input())
y=int(input())
print(rand_val(x,y))
import datetime
def rand(s,n):
'''
This function create random number between the given range, its maximum range is 6 digits
'''
s = int(s)
n = int(n)
list_sec = datetime.datetime.now()
last_el=str(list_sec).split('.')[-1]
len_str=len(str(n))
get_number_elements = last_el[-int(len_str):]
try:
if int(get_number_elements)<=n and int(get_number_elements)>=s:
return get_number_elements
else:
max_value = int('9'*len_str)
res = s+int(get_number_elements)*(n-s)/(max_value)
return res
except Exception as e:
print(e)
我需要编写函数 -
random_number(minimum,maximum)
在不使用随机模块的情况下,我这样做了:
import time
def random_number(minimum,maximum):
now = str(time.clock())
rnd = float(now[::-1][:3:])/1000
return minimum + rnd*(maximum-minimum)
我不确定这是否合适..有没有已知的方法可以节省时间?
是否允许读取某些特殊文件中的随机数据?在 Linux 下,文件 `/dev/urandom' 提供了一种获取随机字节的便捷方法。你可以这样写:
import struct
f = open("/dev/urandom","r")
n = struct.unpack("i",f.read(4))[0]
但这在 Windows 下不起作用。
使用API?如果允许的话。
import urllib2
def get_random(x,y):
url = 'http://www.random.org/integers/?num=1&min=[min]&max=[max]&col=1&base=10&format=plain&rnd=new'
url = url.replace("[min]", str(x))
url = url.replace("[max]", str(y))
response = urllib2.urlopen(url)
num = response.read()
return num.strip()
print get_random(1,1000)
The thing is I need to do something that somehow uses the time
您可以根据 clock drift:
生成随机数import struct
import time
def lastbit(f):
return struct.pack('!f', f)[-1] & 1
def getrandbits(k):
"Return k random bits using a relative drift of two clocks."
# assume time.sleep() and time.clock() use different clocks
# though it might work even if they use the same clock
#XXX it does not produce "good" random bits, see below for details
result = 0
for _ in range(k):
time.sleep(0)
result <<= 1
result |= lastbit(time.clock())
return result
一旦你有了 getrandbits(k)
,就可以直接得到范围 [a, b] 内的随机整数,包括两个端点。 Based on CPython Lib/random.py:
def randint(a, b):
"Return random integer in range [a, b], including both end points."
return a + randbelow(b - a + 1)
def randbelow(n):
"Return a random int in the range [0,n). Raises ValueError if n<=0."
# from Lib/random.py
if n <= 0:
raise ValueError
k = n.bit_length() # don't use (n-1) here because n can be 1
r = getrandbits(k) # 0 <= r < 2**k
while r >= n: # avoid skew
r = getrandbits(k)
return r
例如,生成 20 个从 10 到 110 的随机数,包括:
print(*[randint(10, 110) for _ in range(20)])
输出:
11 76 66 58 107 102 73 81 16 58 43 107 108 98 17 58 18 107 107 77
如果 getrandbits(k)
returns k
随机位,那么 randint(a, b)
应该按原样工作(没有因模数等原因造成的偏差)。
要测试 getrandbits(k)
的质量,可以使用 dieharder
实用程序:
$ python3 random-from-time.py | dieharder -a -g 200
其中 random-from-time.py
生成无限(随机)二进制流:
#!/usr/bin/env python3
def write_random_binary_stream(write):
while True:
write(getrandbits(32).to_bytes(4, 'big'))
if __name__ == "__main__":
import sys
write_random_binary_stream(sys.stdout.buffer.write)
其中 getrandbits(k)
定义如上。
以上假定您不允许使用os.urandom()
或ssl.RAND_bytes()
,或一些已知的PRNG算法如Mersenne Twister来实现getrandbits(k)
.
使用“
time.sleep()
+ time.clock()
”实现的 getrandbits(n)
未通过 dieharder
测试(太多不是巧合)。
这个想法仍然合理:时钟漂移可以用作随机性(熵)的来源,但您不能直接使用它(分布不均匀 and/or 某些位是相关的);这些位可以作为种子传递给接受任意熵源的 PRNG。参见 "Mixing" section。
想法是使用时间模块获取 0 和 1 之间的数字,并使用它来获取 range.Following 中的数字将在 20 和 60 范围内随机打印 20 个数字
from time import time
def time_random():
return time() - float(str(time()).split('.')[0])
def gen_random_range(min, max):
return int(time_random() * (max - min) + min)
if __name__ == '__main__':
for i in range(20):
print gen_random_range(20,60)
这里我们需要了解一件事 使用 random 生成随机变量 在 运行 时间给出的值。为此我们需要 时间模块
time.time() 给你随机值(数字接近 17)。 我们需要以毫秒为单位,所以我们需要乘以 1000 如果我需要 0-10 的值 那么我们需要得到小于 10 的值,这意味着我们需要以下内容: time.time%10(但它是浮点数我们需要转换成整数) 整数(time.time%10)
import time
def rand_val(x):
random=int(time.time()*1000)
random %= x
return random
x=int(input())
print(rand_val(x))
找到范围 (x,y) 之间的随机值
您需要在 x
处从高存储中减去低范围然后从0-x随机找
然后将值加到low range-> lowrange+x(x是随机的)
import time
def rand_val(x,y):
sub=y-x
random=int(time.time()*1000)
random %=sub
random+=x
return random
x=int(input())
y=int(input())
print(rand_val(x,y))
import datetime
def rand(s,n):
'''
This function create random number between the given range, its maximum range is 6 digits
'''
s = int(s)
n = int(n)
list_sec = datetime.datetime.now()
last_el=str(list_sec).split('.')[-1]
len_str=len(str(n))
get_number_elements = last_el[-int(len_str):]
try:
if int(get_number_elements)<=n and int(get_number_elements)>=s:
return get_number_elements
else:
max_value = int('9'*len_str)
res = s+int(get_number_elements)*(n-s)/(max_value)
return res
except Exception as e:
print(e)