0

我正在开发一个需要可重现随机数的应用程序。我使用srandom()种子来初始化随机数序​​列。然后我用random()这个种子生成随机数。如果这是唯一生成随机数的线程,那么一切正常。但是,如果有多个线程生成随机数,它们就会相互干扰。

显然,随机数序列不是线程安全的。必须有一个由所有线程调用的中央随机数生成器。

我的应用程序生成数百个对象,每个对象都有四个以这种方式生成的 14 个随机数序列。这 4 个序列中的每一个都有自己的非随机种子。这样,随机数应该是可重现的。问题是,由于我刚才描述的线程干扰,有时正在生成的 14 个数字的序列会被另一个线程的随机数请求中断。

想了很久,还是决定打电话

dispatch_sync(dispatch_get_main_queue(), ^{//generate the 14 numbers}); 

得到每个序列。这应该迫使它们以正确的顺序生成。在阅读文档时,它说如果在它正在运行的队列上调用可能会出现死锁dispatch_sync。我如何判断我是否已经在主队列中?如果我是,我不需要派遣任何东西,对吧?

有一个更好的方法吗?

我怀疑另一种方法与此类似,但使用专用队列而不是主队列。我以前从未尝试过自己制作队列。此外,需要调用队列的方法是临时的,所以如果我要走那条路线,我需要以某种方式传递自定义队列。如何将队列作为参数传递?

现在,我正在按照上面的想法运行,同步调度到主队列,并且该应用程序似乎运行良好。在最坏的情况下,这段代码将运行大约 4800 次(1200 个对象中的每个对象运行 4 次,这是目前的最大值)。

4

2 回答 2

0

另一种选择是让单身人士进行计算。需要一组随机数的对象会批量向单例请求它们。

于 2013-06-30T18:47:43.367 回答
0

我假设您想要计算随机数,而不是加密随机数。

我的建议是为每个线程设置单独的 RNG,每个线程 RNG 从主 RNG 集中播种。由于系统 RNG 不是线程安全的,因此创建自己的小型 RNG 方法——一个好的 LCG 应该可以工作——在一个线程中独占使用。

使用内置random()只为每个子线程生成初始种子。设置整体初始种子srandom()将确保线程本地my_random()方法都将获得一致的初始重新种子,只要线程每次以相同的顺序启动。

实际上,您正在构建 RNG 层次结构以匹配您的线程层次结构。

于 2013-06-28T12:30:13.947 回答