Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Algorithm 一种函数,其中输入的微小变化总是导致输出的巨大变化_Algorithm_Math_Function_Numbers_Random - Fatal编程技术网

Algorithm 一种函数,其中输入的微小变化总是导致输出的巨大变化

Algorithm 一种函数,其中输入的微小变化总是导致输出的巨大变化,algorithm,math,function,numbers,random,Algorithm,Math,Function,Numbers,Random,我想要一个函数的算法,它接受n个整数并返回一个整数。对于输入中的小变化,得到的整数应该变化很大。尽管我修了很多数学课程,但我并没有很好地运用这些知识,现在我需要一些帮助 此函数的一个重要特性是,如果将坐标对用作输入,并将结果打印(例如,作为灰度值)到图像上,则只有当图像非常大时,才能看到任何重复图案 我曾尝试过各种伪随机数算法,但收效甚微,最后我发现md5几乎符合我的标准,只是它不适用于数字(至少据我所知不是)。这就产生了类似于Python原型的东西(对于n=2,可以很容易地更改为获取整数列表)

我想要一个函数的算法,它接受n个整数并返回一个整数。对于输入中的小变化,得到的整数应该变化很大。尽管我修了很多数学课程,但我并没有很好地运用这些知识,现在我需要一些帮助

此函数的一个重要特性是,如果将坐标对用作输入,并将结果打印(例如,作为灰度值)到图像上,则只有当图像非常大时,才能看到任何重复图案

我曾尝试过各种伪随机数算法,但收效甚微,最后我发现md5几乎符合我的标准,只是它不适用于数字(至少据我所知不是)。这就产生了类似于Python原型的东西(对于n=2,可以很容易地更改为获取整数列表):


但很明显,当输入和输出都是整数时,检查字符串是错误的。什么是这个实现的好替代品(在伪代码、python或任何语言中)?

哈希非常适合您的需求。如果你真的不想使用字符串,那就找一个包含数字或二进制数据的散列库。但是在我看来,在这里使用字符串是可以的。

看看这个,也许你会受到启发

在混沌动力学中,微小的变化会产生很大的变化

一个“散列”是为准确地解决您所描述的问题而创建的解决方案。看

您使用的任何哈希函数都很好;散列函数的判断往往基于以下标准:

  • 它们防止冲突的程度(两个独立的输入产生相同的输出)——其副产品是函数最小化任何输入可能永远无法达到的输出的程度
  • 在给定一组均匀分布的输入时,其输出的分布是一致的
  • 输入中的小变化在多大程度上会导致输出中的大变化
(见附件)

考虑到创建一个最大化所有这些条件的哈希函数有多么困难,为什么不使用一个最常用且依赖于现有哈希函数的函数呢

从表面上看,将整数转换成字符串几乎像是另一层加密!(我想这对你的目的是好的)

但是,您的问题要求使用专门处理数字的哈希函数,所以我们开始吧


处理整数的哈希函数 如果你想借用已有的算法,你可能想涉足

一个简单的方法是中间平方法:

  • 取一个数字
  • 摆正
  • 把数字切掉,中间的数字和原来的数字一样长

<P>,在中间平方法中,1111是“散列”到2342,

这种方法不是有效的,但是对于一些散列,它具有非常低的碰撞率、均匀的分布和巨大的混沌潜力(小变化=>大变化)。但是如果你有很多价值观,那么是时候去寻找别的东西了

(Mersenne Twister)[是所有可行有效且简单的随机数生成器的老爹。事实上,每种编程语言都可能有一个实现。你的散列“输入”在它们的术语中被称为“种子”

总之

  • 基于字符串的哈希函数没有问题
  • 如果您想坚持使用整数并保持花哨,请尝试使用您的数字作为伪随机数生成器的种子

  • 当n=3时,这是一个经典的选择。

    正如其他人所指出的,哈希函数完全可以满足您的需要。哈希函数获取字节(而不是字符串)并返回字节,当然,整数和字节之间的转换很简单。下面是一个python函数示例,它可以处理32位整数,并输出32位整数:

    import hashlib
    import struct
    
    def intsha1(ints):
      input = struct.pack('>%di' % len(ints), *ints)
      output = hashlib.sha1(input).digest()
      return struct.unpack('>i', output[:4])
    

    当然,它可以很容易地适应不同长度的输入和输出。

    一个x位分组密码会将一个数字有效地转换为另一个数字。您可以组合(和/多?)输入数字并对其进行加密,或对每个数字进行迭代加密-类似于CBC或链式模式。谷歌“保留格式加密”。可以创建32位分组密码(不广泛“可用”)并使用它创建“哈希”输出。哈希和加密的主要区别在于哈希是不可逆的。

    这是一个很好的答案,但是:我的一次失败尝试是使用Mersenne Twister,所以我想我需要的是一个实际的示例实现,伪代码也可以。至少已经一年了(可能更久)因为我在试验这个,所以我不记得我的问题到底是什么。哎呀,我没有注意到你在问题中特别提到尝试伪随机数。我现在觉得有点傻。不管怎样,你有什么理由尝试从头开始编写Mersenne,而不是使用预先存在的库?什么您使用的是哪种语言?请看皮特·科克汉姆对鲍勃·詹金斯的混合函数的回答;这似乎是您可以使用的东西。@mstksg:当我查看维基百科页面上的代码时,我看到一些东西,它只需要一个种子,然后就可以生成一个接一个的数字。这是不是可以转换成一个有趣的函数(n0,n1,…)->x?为了回答您上面的问题,重写:我不需要从头开始创建它,但我需要它来匹配我想要的签名。谢谢,但我正在寻找一个实际的算法。我刚刚简单地扫描了文本,所以:它是否仅限于n=3?它说的是“密钥是未对齐的可变长度字节数组”这似乎表明任何n都可以使用。你可以使用mix来增加dis
    1111 => 01234321 => 2342
    
    import hashlib
    import struct
    
    def intsha1(ints):
      input = struct.pack('>%di' % len(ints), *ints)
      output = hashlib.sha1(input).digest()
      return struct.unpack('>i', output[:4])