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

2vuwiymt  于 2023-05-16  发布在  Python
关注(0)|答案(8)|浏览(167)

我需要写函数-

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)

我不确定这是好的。有没有一个已知的方法来做这件事的时间?

b1payxdu

b1payxdu1#

问题是我得做点什么来利用时间
您可以根据时钟漂移生成随机性:

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]中的随机整数,包括两个端点。基于CPython库/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)
使用“time.sleep() + time.clock()”实现的getrandbits(n)未通过dieharder测试(太多,不可能是巧合)。
这个想法仍然是合理的:时钟漂移可以用作随机性(熵)的来源,但不能直接使用(分布不均匀和/或某些位是相关的);这些比特可以作为种子被传递到接受任意熵源的PRNG。参见"Mixing" section

v64noz0r

v64noz0r2#

你是否被允许读取一些特殊文件中的随机数据?在Linux下,文件`/dev/urandom'提供了一种获取随机字节的方便方法。你可以这样写:

import struct
f = open("/dev/urandom","r")
n = struct.unpack("i",f.read(4))[0]

但这在Windows下不起作用。

cbeh67ev

cbeh67ev3#

我们的想法是使用时间模块得到0到1之间的数字,并使用它来得到一个范围内的数字。下面将随机打印20个数字,范围为20到60

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)
rwqw0loc

rwqw0loc4#

这里我们需要了解一件事,即随机变量是通过使用运行时给出的随机值生成的。为此我们需要时间模块
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))
vx6bjr1n

vx6bjr1n5#

如果允许,使用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)
hmmo2u0o

hmmo2u0o6#

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)
6ljaweal

6ljaweal7#

查找范围(x,y)中的随机值
你需要从x的高存储中减去低范围
然后从0-x中找出random
然后将值添加到低范围->低范围+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))
tcbh2hod

tcbh2hod8#

def rand(fro,to):
    x=set()
    for i in range(fro,to+1):
        x.add(str(i))
    print(list(x)[fro])
rand(1,10)

相关问题