Python随机函数,不使用随机模块

时间:2015-02-24 20:49:45

标签: python function random time

我需要编写函数 -

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)

我不确定这是好的..有没有一种已知的方法可以用时间来做?

6 个答案:

答案 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))