Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 许多独立的伪随机图,每个图对任何输入x具有相同的任意y_Python_Algorithm_Random_Python 3.4 - Fatal编程技术网

Python 许多独立的伪随机图,每个图对任何输入x具有相同的任意y

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,

我所说的“图形”是指数学意义上的“函数”,在这个意义上,每x值总是有一个不变的y值

Python的
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)方法,并且只使用每个系列中的第一个术语

  • 否则,您可能希望停止使用内置的python功能&设计您自己的(更可预测的)算法

    编辑新信息:

    嗯。所以我也看了你的个人资料&所以你在做一些(音乐?)而不是任何新的加密东西。如果是这样的话,那么不幸的是喜忧参半,因为虽然你不需要安全性,但你仍然不希望(声音)模式出现。所以很不幸,你仍然需要一个强大的prng

    我想要的一个变压器向输入y添加一个随机值 坐标取决于输入的x坐标

    我还不清楚y是否真的需要依赖于x

    现在假设我想要两个不同的变压器实例 将随机值添加到y。我的问题是关于我的选择 这个新的随机变压器给出的值与第一个不同

    …因为在这里,我得到的印象是,你真正需要的是两个不同的实例以某种随机方式不同

    但是,假设你有一个包含元组(x,y)的对象,你真的想要一个
    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,而不仅仅是已知的一把。至于第二个想法