Algorithm 一种函数,其中输入的微小变化总是导致输出的巨大变化
我想要一个函数的算法,它接受n个整数并返回一个整数。对于输入中的小变化,得到的整数应该变化很大。尽管我修了很多数学课程,但我并没有很好地运用这些知识,现在我需要一些帮助 此函数的一个重要特性是,如果将坐标对用作输入,并将结果打印(例如,作为灰度值)到图像上,则只有当图像非常大时,才能看到任何重复图案 我曾尝试过各种伪随机数算法,但收效甚微,最后我发现md5几乎符合我的标准,只是它不适用于数字(至少据我所知不是)。这就产生了类似于Python原型的东西(对于n=2,可以很容易地更改为获取整数列表):Algorithm 一种函数,其中输入的微小变化总是导致输出的巨大变化,algorithm,math,function,numbers,random,Algorithm,Math,Function,Numbers,Random,我想要一个函数的算法,它接受n个整数并返回一个整数。对于输入中的小变化,得到的整数应该变化很大。尽管我修了很多数学课程,但我并没有很好地运用这些知识,现在我需要一些帮助 此函数的一个重要特性是,如果将坐标对用作输入,并将结果打印(例如,作为灰度值)到图像上,则只有当图像非常大时,才能看到任何重复图案 我曾尝试过各种伪随机数算法,但收效甚微,最后我发现md5几乎符合我的标准,只是它不适用于数字(至少据我所知不是)。这就产生了类似于Python原型的东西(对于n=2,可以很容易地更改为获取整数列表)
但很明显,当输入和输出都是整数时,检查字符串是错误的。什么是这个实现的好替代品(在伪代码、python或任何语言中)?哈希非常适合您的需求。如果你真的不想使用字符串,那就找一个包含数字或二进制数据的散列库。但是在我看来,在这里使用字符串是可以的。看看这个,也许你会受到启发 在混沌动力学中,微小的变化会产生很大的变化 一个“散列”是为准确地解决您所描述的问题而创建的解决方案。看 您使用的任何哈希函数都很好;散列函数的判断往往基于以下标准:
- 它们防止冲突的程度(两个独立的输入产生相同的输出)——其副产品是函数最小化任何输入可能永远无法达到的输出的程度
- 在给定一组均匀分布的输入时,其输出的分布是一致的
- 输入中的小变化在多大程度上会导致输出中的大变化
处理整数的哈希函数 如果你想借用已有的算法,你可能想涉足 一个简单的方法是中间平方法:
- 取一个数字
- 摆正
- 把数字切掉,中间的数字和原来的数字一样长
当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])