
一个 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) |