【发布时间】:2016-06-03 04:13:46
【问题描述】:
我需要制作一个具有特定扭曲的伪随机数生成器。我不需要像通常那样通过使用上一代的种子生成新一代随机数来串行生成数字,而是需要从连续的种子序列并行生成的伪随机数序列。
它会像这样工作,并行执行,每个线程只产生一个数字,线程之间没有共享或存储任何内容:
thread #0: my_prng(1000) -> 1455191155 -> array[0]
thread #1: my_prng(1001) -> 2432152707 -> array[1]
thread #2: my_prng(1002) -> 185188134 -> array[2]
它用于从 GPU(使用 OpenCL)并行生成图像噪声,因此:
- 它应该运行得足够快,就像只使用几个操作一样
- 它不应该是加密安全的,它只是用于图形,它只需要随机查看
- 低周期就好了,即使是 2^24 也可以
- 只需要生成 32 位整数
- 它不应该使用任何内存,不应该使用缓冲区,并且不应该在变量中存储除结果之外的任何内容(如果有的话,生成的新种子无论如何都不会被使用)
- 它不能依赖对 rand() 的调用,因为它在 OpenCL 中不可用或依赖于任何库
- 它不应该循环使用连续性(例如循环 60 次只是为了得到第 60 个数字)
- 实际上只需要从像 1000 这样的种子中生成一个良好的伪随机数,它与由相邻种子生成的数字不共享模式
我尝试过的任何典型 PRNG 算法都不能从相邻的种子中生成序列,这些序列看起来甚至很随机,它们不应该以这种方式播种和使用。
【问题讨论】:
-
你有 64 位数学吗?
-
是的,但是它可能会慢得多,所以如果可能的话最好避免。
标签: random