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)