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