我正在尝试使用 CURAND 库来生成完全独立的随机数。因此,我想为每个线程提供不同的种子。那么,问题 1:如何为每个线程提供不同的种子?(CUDA 中是否有一些我可以使用的时间函数?)
现在我还想在 0 到 10000 的范围内生成这个随机数。我该如何实现呢?
目前我正在使用 curand_normal (因为我想从正态分布中获得数字)但它给了我我不想要的负数和相同的数字。
设置不同的种子不是获得独立(非相关)随机数(使用任何单个随机数生成器)的统计上合理的方法。您最好选择单个序列的不同子序列,大多数随机数库都允许您这样做,包括 cuRAND。
查看 CUDA SDK 中的示例,例如 EstimatePiP 或 EstimatePiInlineP 示例使用 cuRAND 生成伪随机数。
对于您问题的第二部分,如 cuRAND 手册中所述,curand_normal()
例程返回平均值为 0.0 和标准差为 1.0 的正态分布数字(即标准正态分布)。显然,这意味着您将有约 50% 的负数。
与正态分布一起指定固定范围是没有意义的。您要么想要其他一些具有固定范围的分布(例如均匀分布),要么想要具有特定均值和标准分布的正态分布。从标准正态到你的目标平均值/std.dev。您只需将随机抽取乘以目标标准偏差并添加目标均值。