我正在尝试使用 Boost 的正态分布来生成给定不同种子的随机数。换句话说,我需要为 seed1、seed2 等生成相同的随机数;在模拟过程中,成千上万的种子将被传递给函数。随机数生成器永远不会被非种子使用。[编辑:“密钥”比“种子”更好——见下面的最终描述块。]我不确定生成单个 RNG 并重新设置它是否最有意义(如果是,如何)或如果每次生成一个新的更容易。这是我到目前为止所拥有的,其中涉及在每次请求随机正常数时构建一个新的种子 rng:
double rnorm( int thisSeed ) {
boost::mt19937 rng( thisSeed );
boost::normal_distribution<> nd( 0.0, 1.0 ); // (mean, sd)
boost::variate_generator > var_nor( rng, nd );
return var_nor();
}
这是哑巴吗?我是 PRNG 的新手,尤其是 Boost 的实施。
更全面地描述我为什么这样做:
我正在创建一个巨大的随机能量图来模拟蛋白质相互作用:每个序列都有一个特定的能量,该能量被计算为淬火高斯随机数的总和,该随机数取决于特定位置的特定氨基酸的值(以及一些其他序列属性)。我想使用 PRNG 来计算这些伪随机值是什么:这些值必须是一致的(相同的序列应该产生相同的值),但是要存储的太多了。举个简单的例子,我可能有一个序列 ARNDAMR 并根据两个子能量计算它的总能量:一个是随机正态数,取决于 A 在位置 1 和 D 在位置 4,另一个子能量是随机数取决于最后三个氨基酸。我' m 将配置转换为密钥,用作我的 PRNG 的种子(参数)。成千上万的序列将被构建和变异,所以我需要一种快速计算能量的方法——所以我需要知道如何最好地播种和调用我的 RNG。除了这些能量值“查找”之外,我不会将 Boost RNG 用于其他任何事情。
进一步(tl; dr)解释:
我将拥有介于 1 和 10^6 或 10^7 之间的整数的“关键”值。我希望每个都映射到一个高斯随机数。键值与其数字之间不应存在任何互相关(例如,键 145-148 不应映射到自相关的“随机”数字)。
每次在模拟中调用它(密钥)时,我都需要一个给定的密钥来返回相同的随机数。我不想将键随机数对存储在查找表中。