当前位置: 首页 > 知识库问答 >
问题:

如何制作非随机数生成器?

梁兴文
2023-03-14

我想构造一个像随机数生成器一样工作的对象,但它会以指定的顺序生成数字。

# a random number generator
rng = lambda : np.random.randint(2,20)//2

# a non-random number generator
def nrng():
    numbers = np.arange(1,10.5,0.5)
    for i in range(len(numbers)):
        yield numbers[i]

for j in range(10):
    print('random number', rng())
    print('non-random number', nrng())

上面代码的问题,我不能在最后一行调用nrn,因为它是一个生成器。我知道重写上述代码最直接的方法是简单地循环非随机数,而不是定义生成器。我更愿意让上面的例子起作用,因为我正在处理一大块代码,其中包括一个函数,该函数接受一个随机数生成器作为参数,我想添加传递非随机数序列的功能,而无需重写整个代码

共有3个答案

柯镜
2023-03-14

np。随机的randint可以记住它生成的最后一个数字,因为它是np的函数。随机的随机状态类。Numpy只是给类方法加了别名,这样就可以直接从np访问它。随机模块,而不是通过课堂访问它。

知道了这一点,你可以编写自己的类来这样工作:

class NotRandom:

    numbers = np.arange(1,10.5,0.5)
    last_index = -1

    @classmethod
    def nrng(cls):
        cls.last_index += 1
        if cls.last_index < len(cls.numbers):
            return cls.numbers[cls.last_index]
        # else:
        return None

# Create an alias to the classmethod
nrng = NotRandom.nrng      # Note this is OUTSIDE the class

然后,你可以做:

print(nrng())    # 1.0
print(nrng())    # 1.5
print(nrng())    # 2.0

如果您希望能够拥有nrng的多个并发实例,您可以使nrng()成为实例方法,而不是类方法:

class NotRandom:
    def __init__(self):
        self.numbers = np.arange(1,10.5,0.5)
        self.last_index = -1

    def nrng(self):
        self.last_index += 1
        if self.last_index < len(self.numbers):
            return self.numbers[self.last_index]
        # else:
        return None

# Create an object. Then create an alias to its method
nrng = NotRandom().nrng 

然后,可以使用nrn()引用绑定到所创建的NotRandom实例的方法。如果你想要另一个实例,你也可以:

another_notrandom = NotRandom()
nrng2 = another_notrandom.rng

print(nrng())    # 1.0
print(nrng())    # 1.5

print(nrng2())   # 1.0

print(nrng())    # 2.0

print(nrng2())   # 1.5

卫皓
2023-03-14

如果希望对象保持状态并看起来像一个函数,请使用\uuuuu call\uuuu方法创建一个自定义类。

Eg.

class NRNG:
    def __init__(self):
        self.numbers = range(10)
        self.state = -1
    def __call__(self):
        self.state += 1
        return self.numbers[self.state]
        
nrng = NRNG()


for i in range(10):
    print(nrng())

然而,除非绝对必要,否则我不建议这样做,因为这掩盖了您的nrng保持状态的事实(尽管从技术上讲,大多数RNG在内部保持状态)。

最好通过调用next来使用一个带有yield的常规生成器,或者编写一个自定义迭代器(也基于类)。这些将与for循环和其他python迭代工具(比如优秀的itertools包)一起使用。

淳于典
2023-03-14

可以使用生成器或迭代器作为参数调用next(),从中提取一个元素。事先将生成器保存为变量可以多次执行此操作。

# make it a generator
def _rng():
    while True:
        yield np.random.randint(2,20)//2

# a non-random number generator
def _nrng():
    numbers = np.arange(1,10.5,0.5)
    for i in range(len(numbers)):
        yield numbers[i]

rng = _rng()
nrng = _nrng()
for j in range(10):
    print('random number', next(rng))
    print('non-random number', next(nrng))
 类似资料:
  • 问题内容: 您能告诉我任何生成非均匀随机数的方法吗? 我正在使用Java,但是代码示例可以随心所欲。 一种方法是通过将两个统一的随机数加在一起(即滚动2个骰子)来创建歪斜分布。 问题答案: 您想要什么分布的偏差? 这是一种始终有效的技术,但并不总是最有效的。累积扰动函数P(x)给出值低于x的时间的分数。因此,在x的最小可能值处P(x)= 0,在x的最大可能值处P(x)= 1。每个分布都有一个唯一的

  • 本文向大家介绍如何在Python中生成非重复随机数?,包括了如何在Python中生成非重复随机数?的使用技巧和注意事项,需要的朋友参考一下 接下来的程序会生成10个介于1到100之间的随机非重复整数。它会在给定的时间间隔内生成一个随机整数,如果先前未添加过该整数,则将其添加到列表中。

  • 问题内容: 我想创建一组随机数,在Java中没有重复项。 例如,我有一个数组来存储10,000个从0到9999的随机整数。 这是我到目前为止的内容: 但是上面的代码创建重复项。如何确保随机数不重复? 问题答案: 例如:

  • 我想使用c生成0-2^64范围内的非常大的随机数。我使用了rand()函数,但它没有生成非常大的数字。任何一个都可以帮助吗?

  • 本文向大家介绍如何生成一个随机数?相关面试题,主要包含被问及如何生成一个随机数?时的应答技巧和注意事项,需要的朋友参考一下  

  • 问题内容: 我们如何在Java中生成非常大的随机数?我说的是10000位数吗?我知道我们必须使用BigInteger,但是我们该怎么做呢?做这样的事情最有效的方法是什么?请提供一个小例子。谢谢。 问题答案: 嗯,一种方法是转到Random.org并下载二进制随机文件之一。这些文件是由大气噪声生成的,因此非常随机。我在国际象棋引擎中将其用于Zobrist键。 或者你可以去 这会给你你想要的。在此示例