python如何基于给定的输入生成随机数而不使用随机库?

2024-10-04 03:15:44 发布

您现在位置:Python中文网/ 问答频道 /正文

假设有一个rand8函数返回一个介于[0-7]之间的随机数。现在,我想根据从rand8得到的输入生成一个函数,即rand11。像这样:

 Input from rand8     : 1, 3 , 5  , 7 , 0 , 7 , 2 , 1 , 6 , ...
Output given by rand11: 0, 5 , 10 , 7 , 6 , 0 , 2 , 9 , 8 , ...

到目前为止,我在网上发现:

def lcg(modulus, a, c, seed):
    while True:
        seed = (a * seed + c) % modulus
        yield seed

a = lcg(5, 0, 8, 1)
next(a)

但我不太熟悉如何修改函数以得到0到7之间的数字,并返回0到10之间的数字。请注意,我不需要实现rand8函数。我只需要处理rand11函数?请记住,我不允许使用python中的random库或任何其他像numpy.random()这样的随机库

有人能帮我吗?你知道吗


Tags: 函数frominputoutputbydef数字random
1条回答
网友
1楼 · 发布于 2024-10-04 03:15:44

这将给出您所期望的输出的列表。如您所见,如果您运行这个程序,它会给出0到10之间的值的均匀分布。随机库仅用于生成较大的rand8种子列表。你知道吗

from random import randint
import collections

result = []

#seeds = [1, 3 , 5  , 7 , 0 , 7 , 2 , 1 , 6]
seeds = [randint(0,7) for i in range(1000000)]
gen = 1
for se in seeds:
    gen = (se  + gen) % 11
    result.append(gen)

counter =collections.Counter(result)
print(counter)

如果希望函数每次运行时都有不同的结果,可以添加一个乘数。未显示均匀分布的最终代码:

result = []
c = int(input("Seed?"))
seeds = [1, 3 , 5  , 7 , 0 , 7 , 2 , 1 , 6]
gen = 1
for se in seeds:
    gen = (se * c + gen) % 11
    result.append(gen)

print(result)

相关问题 更多 >