一个 20000+ ~ 30000+
的正整数,能否通过一个算法固定的映射到 0~255
的三个数字,而且足够离散(即随机程度比较高)。
比如
我的初步想法是能不能 n % 255, n * 3 % 255, n * 7 % 255 这样,不过这样似乎会导致 3 个数字之间有一定的关联,不够随机。不知道大家有没有什么好办法呢。
1
QAPTEAWH 2017-09-27 15:45:27 +08:00
相当于映射到 0~16777215 ?
|
2
qq316107934 2017-09-27 15:47:56 +08:00
CRC32(int) % 16777215 % 255 % 65535
|
3
Valyrian 2017-09-27 15:49:35 +08:00
何止是有一定关联, ((n%255)x3)%255 = 3n%255
|
4
zj299792458 2017-09-27 15:50:31 +08:00
把一个 3 万的集合映射到一个几千万的集合,好像不太够?
|
5
flyingghost 2017-09-27 15:51:16 +08:00
看起来不需要可逆?
那就相当随意了。。。sum(md5(n)) % 255 反正足够随机+落到 0~255 范围内即可。 |
6
luos543 2017-09-27 15:51:37 +08:00
用这个正整数作为 seed 生成 3 个随机数(逃
|
7
qq316107934 2017-09-27 15:53:05 +08:00
@luos543 #6 不满足固定映射的条件,感觉还是要用哈希函数
|
8
momocraft 2017-09-27 15:53:28 +08:00
密码学 hash 应该比简单 hash 更有利于离散,比如 md5() 后取末尾 24bit
|
9
luos543 2017-09-27 15:54:09 +08:00
@qq316107934 是固定映射,因为大部分随机库都是假随机。
|
10
nousername2030 2017-09-27 15:55:40 +08:00
@luos543 不同 seed 得到的序列混用是不符合随机特性的
|
11
zhy0216 2017-09-27 16:05:13 +08:00
sin(x) * 16777215 ?
|
12
zhy0216 2017-09-27 16:06:39 +08:00
^^ 错了
(sin(x) + 1) / 2 * 16777215 |
13
af463419014 2017-09-27 16:24:17 +08:00
用现成的离散算法计算,然后再取模
数字的 hash 连续的,那就 md5 一下 hash(md5(x))%(256*256*256) |