欢迎光临散文网 会员登陆 & 注册

附录 | Bug踩坑----随机数引擎

2020-03-19 19:53 作者:有木乘舟  | 我要投稿

  在计算随机运动轨迹的时候,需要用到c++11的随机数引擎类(random_number_engines)来产生随机数序列,并通过随机数分布类(random-number distribution)使用随机数引擎生成服从特定概率分布的随机数。

  正常情况下,只需要这样就可以生成一个服从分布的随机数:

  但是,这个随机数引擎类有个巨大的坑,即:

  • default_random_engine类下一次运算结果依赖于上一次,初次实例化该类的时候,它的值只和time(0)有关。因此,在同一个实例中,多次使用该类去生成随机数,每一次的计算结果依赖于上一次的计算结果,因此能生成数值分布较大的随机数。

  • 但是,由于它每次实例化只和time(0)有关,所以如果我们在较短时间内多次实例化该类,每次都会调用time(0)重新初始化,且由于time(0)的数值差别不大,因此 e(time(0)) 的计算结果是基本相同的,就导致了 m(e) 的值也基本相同。

  这个特性在需要在一个类中多次调用另一个类来生成一个随机数的时候,会发生意想不到的BUG:

  上面这样使用随机数引擎类的结果是每次的 t 都是差不多的,相差很小,就达不到生成随机数的效果了。

  可以使用 rand()函数来避免这个BUG,但是注意也是同样不能设置随机种子,不然还是会跟随机数引擎类一样。

附录 | Bug踩坑----随机数引擎的评论 (共 条)

分享到微博请遵守国家法律