输入中的微小变化总是导致输出变化很大的函数

Pet*_*ric 5 random algorithm math numbers function

我想要一个函数的算法,它采用n个整数并返回一个整数.对于输入中的微小变化,结果整数应该有很大差异.尽管我已经学了很多数学课程,但我还没有充分利用这些知识,现在我需要一些帮助......

此函数的一个重要属性应该是,如果它与坐标对一起用作输入并且在图像上绘制结果(例如,作为灰度值),则任何重复模式应该仅在图像非常大时才可见.

我已经尝试了各种伪随机数算法,但收效甚微,最后让我觉得md5几乎符合我的标准,除了它不是数字(至少不是我所知道的).这导致类似这样的Python原型(对于n = 2,当然可以很容易地将其更改为采用整数列表):

import hashlib
def uniqnum(x, y):
    return int(hashlib.md5(str(x) + ',' + str(y)).hexdigest()[-6:], 16)
Run Code Online (Sandbox Code Playgroud)

但显然,当输入和输出都是整数时,查看字符串会感觉不对.什么是这个实现的良好替代品(伪代码,python或任何语言)?

Jus*_* L. 8

"哈希"是创建解决解决方案正是你所描述的问题.请参阅维基百科的文章

你使用的任何哈希函数都会很好; 哈希函数倾向于根据以下标准来判断:

  • 它们防止冲突的程度(两个单独的输入产生相同的输出) - 这个的副产品是函数最小化输出的程度,这些输出可能永远不会从任何输入到达.
  • 在给定均匀分布的输入集的情况下,其输出的分布是均匀的
  • 输入中的微小变化在输出中产生大的变化的程度.

(见完美哈希函数)

鉴于创建一个最大化所有这些标准的哈希函数是多么困难,为什么不使用最常用和依赖的现有哈希函数之一呢?

从它看来,将整数转换成字符串几乎就像是另一层加密!(这对你的目的有好处,我假设)

但是,您的问题要求专门处理数字的哈希函数,所以我们继续.


散列函数可以在整数上运行

如果您想借用已有的算法,您可能需要涉及伪随机数生成器

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

  • 拿一个数字
  • 广场吧
  • 剪下数字并保留中间数字与原始数字相同的长度.

1111 => 01234321 => 2342
Run Code Online (Sandbox Code Playgroud)

因此,在中间方法中,1111将被"哈希"到2342.

这种方式并不是那么有效,但对于少数哈希,它具有非常低的碰撞率,均匀分布和巨大的混沌潜力(小变化=>大的变化).但是,如果你有很多价值观,那么有时间寻找其他东西......

所有可行的高效且简单的随机数生成器的祖父是(Mersenne Twister)[ http://en.wikipedia.org/wiki/Mersenne_twister].事实上,对于每种可以想象的编程语言,可能都有一个实现.您的哈希"输入"在其术语中称为"种子".

结论

  1. 基于字符串的哈希函数没有错
  2. 如果你想坚持整数并且想要使用,请尝试使用你的数字作为伪随机数生成器的种子.