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