我需要编写函数 -
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)
我不确定这是好的..有没有一种已知的方法可以用时间来做?
答案 0 :(得分:3)
问题是我需要做一些以某种方式使用时间的事情
您可以根据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
示例,从10到110生成20个随机数,包括:
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)
返回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)
。
getrandbits(n)
使用“time.sleep()
+ time.clock()
”执行失败dieharder
测试(太多不巧合)。
这个想法仍然是合理的:时钟漂移可以用作随机源(熵),但你不能直接使用它(分布不均匀和/或某些比特依赖);这些比特可以作为种子传递给接受任意熵源的PRNG。请参阅"Mixing" section。
答案 1 :(得分:2)
您是否可以在某些特殊文件中读取随机数据?在Linux下,文件`/ dev / urandom&#39;提供了获取随机字节的便捷方法。你可以写:
import struct
f = open("/dev/urandom","r")
n = struct.unpack("i",f.read(4))[0]
但是这在Windows下无效。
答案 2 :(得分:1)
在这里我们需要了解一件事 通过使用随机数生成随机变量 在运行时给出的值。为此,我们需要 时间模块
time.time()为您提供随机值(数字计数接近17)。 我们需要毫秒,所以我们需要乘以1000 如果我需要0-10的值 那么我们需要获得小于10的值,这意味着我们需要满足以下条件: time.time%10(但它处于浮动状态,我们需要转换为int) int(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))
答案 3 :(得分:0)
使用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)
答案 4 :(得分:0)
content_type
答案 5 :(得分:-1)
查找范围(x,y)之间的随机值
您需要从x的高位存储中减去低位范围
然后从0-x处随机查找
然后将值添加到低范围-> 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))