Python 许多独立的伪随机图,每个图对任何输入x具有相同的任意y
我所说的“图形”是指数学意义上的“函数”,在这个意义上,每x值总是有一个不变的y值 Python的Python 许多独立的伪随机图,每个图对任何输入x具有相同的任意y,python,algorithm,random,python-3.4,Python,Algorithm,Random,Python 3.4,我所说的“图形”是指数学意义上的“函数”,在这个意义上,每x值总是有一个不变的y值 Python的random.random类的seed表现为随机图的x坐标,每次调用random.random()都会生成一个包含所有新x-y映射的新随机图 有没有一种方法可以直接引用random.random的第n个图,或者换句话说,在不调用random.random()n次的情况下引用某个种子序列中的第n个值 我正在创建一组类,我称之为Transformers,它将任何(x,y)坐标作为输入,并输出另一对(x,
random.random
类的seed
表现为随机图的x坐标,每次调用random.random()
都会生成一个包含所有新x-y映射的新随机图
有没有一种方法可以直接引用random.random
的第n个图,或者换句话说,在不调用random.random()
n次的情况下引用某个种子序列中的第n个值
我正在创建一组类,我称之为Transformers,它将任何(x,y)坐标作为输入,并输出另一对(x,y)坐标。每个转换器有两种方法:
转换
和取消转换
。我想要的一个转换器根据输入x坐标向输入y坐标添加一个随机值。假设我想让这个转换器取消转换(x,y),现在我需要从y中减去相同的值,如果x是相同的。这可以通过将种子设置为与我添加到y时相同的值来实现,就像x值一样。现在假设我想要两个不同的变压器实例,它们向y添加随机值。我的问题是关于我的选择,让这个新的随机变压器给出与第一个不同的值。您可能需要提出一些更详细的要求,但是的,有几种方法:
n
术语n
术语,那么找到一种生成不同种子的O(1)方法,并且只使用每个系列中的第一个术语transform
函数为相同的x随机改变y;你想要一个untransform
函数来快速撤销任何转换操作,那么为什么不在对象的任何一个实例的整个生命周期中保持状态变化的堆栈呢;然后在untransform
实现中,您只是从堆栈中弹出最后一个转换
有没有一种方法可以直接引用random.random的第n个图,或者换句话说,在不调用random.random()n次的情况下引用某个种子序列中的第n个值
是的,有点;你用。虽然没有真正独立的函数/图——PRNG只生成一个序列——但您可以在任何时候进入它
您似乎仍在处理与相同的问题,我在评论中发布的代码应该包括以下内容:
from random import Random
class IndependentRepeatableRandom(object):
def __init__(self):
self.randgen = Random()
self.origstate = self.randgen.getstate()
def random(self, val):
self.randgen.jumpahead(int(val))
retval = self.randgen.random()
self.randgen.setstate(self.origstate)
return retval
由于Python3.4显然删除了
jumpahead
,下面是一些实现方便的伪随机字典的代码
from hashlib import sha256 as _sha256
from hmac import HMAC as _HMAC
from math import ldexp as _ldexp
from os import urandom as _urandom
from sys import byteorder as _byteorder
class PRF():
def __init__(self):
digestmod = _sha256
self._h = _HMAC(_urandom(digestmod().block_size), digestmod=digestmod)
def __getitem__(self, key):
h = self._h.copy()
h.update(repr(key).encode())
b = h.digest()
return _ldexp(int.from_bytes(b, _byteorder), (len(b) * (- 8)))
用法示例:
>>> import prf
>>> f = prf.PRF()
>>> f[0]
0.5414241336009658
>>> f[1]
0.5238549618249061
>>> f[1000]
0.7476468534384274
>>> f[2]
0.899810590895144
>>> f[1]
0.5238549618249061
你是说这些图不是随机的,而是在一组确定性图中随机选择的?我认为OP是说,无论出于何种原因,他们希望快速访问给定种子序列的任意第n项对算法的工作原理有一些了解(即:同一个x种子在该系列中给出了相同的第n项),但还不足以意识到算法的熵性质实际上排除了这些要求:)NB:他可能写下所有图论内容的原因,是因为他害怕被所有尖头投下一票;可悲的是,无论如何他都没有做到,哈哈,我认为这是一个足够合理的问题;仅通过简要解释为什么需要快速访问第n个项而有所改进:D~btw@pjs:pseudorandom number generators-saulined/are/deterministic;)@violet313:维克托用“随机”这个词作为速记,所以我也这么做了。我完全知道,
random
由PRNG支持。我正试图从维克多那里得到澄清,问题的哪些部分取决于对随机
的调用,而哪些部分则不是。你说得对!这是我第二次尝试问这个问题,我不仅第一次被否决(waaa!),而且以“如何两次获得相同的随机序列?”的重复结束,这是一个微妙但重要的不同于我的目标。为了弄清楚我所问的问题与此不同,我提出了随机模块,其形式与我的目的完全相同(但显然是邪恶的):作为伪随机图的集合。感谢您提供这些。我最初没有给出足够的细节来排除你的第一个建议,但我不能接受,因为,正如我将在上面的编辑中解释的那样,我需要任何x的y,而不仅仅是已知的一把。至于第二个想法