我希望创建一个确定性数字生成函数,其中输入的数字总是生成相同的数字,但没有两个数字最终生成相同的结果.
例如.:
1 -> 3
2 -> 5
3 -> 4
4 -> 2
5 -> 1
然而,我需要它来处理所有可以由特定数据类型表示的数字,例如int64.
这感觉应该是非常简单的,或者完全不可能的.是否有某种随机数生成方案可以保证这种分布,而无需我创建一个包含所有可能数的数组,随机排序,然后使用索引(同时让我耗尽内存)?
非常感谢
我希望创建一个确定性数字生成函数,其中输入的数字总是生成相同的数字,但没有两个数字最终生成相同的结果.
例如.:
1 -> 3
2 -> 5
3 -> 4
4 -> 2
5 -> 1
然而,我需要它来处理所有可以由特定数据类型表示的数字,例如int64.
这感觉应该是非常简单的,或者完全不可能的.是否有某种随机数生成方案可以保证这种分布,而无需我创建一个包含所有可能数的数组,随机排序,然后使用索引(同时让我耗尽内存)?
非常感谢
您需要的转换公式是:
f(P) = (mP + s) mod n
// n = range - so for uint64 2^64
// s < range i.e. < 2^64
// m = must be coprime with n
这是Affine cipher中使用的modular arithmetic.
mod
确保它在期望的范围内,s
是一个简单的移位,m
应该是coprime和n
.
所以对于uint64
范围:
var (
m = uint64(39293) // some non-even number
s = uint64(75321908) // some random number below 2^64
)
func transform(p uint64) uint64 {
return p*m + s // implicitly mod'ed 2^64 by the type's size
}
这可能看起来很神奇,但你可以说服自己它适用于uint16
:
https://go.dev/play/p/EKB6SH3-SGu
因为uint64
将需要相当多的资源来运行:-)