我的程序是 win32 DLL,如下代码:srand(12);该函数产生随机数的起始发生数据,然后我会根据这个起始发生数据(或种子)用rand()生成N个随机数。
但是,我的程序其它功能也需要用到随机数,并且需要重新选取起始发生数据,假如我再次 srand(8);然后还再rand()生成N个随机数,请问能不能不影响第一次的随机数顺序?怎么实现两路随机数互不相干的进行?类似多线程或者多进程。。

解决方案 »

  1.   

    没有办法。只有两个不同线程才能相互不干扰。
    不过你可以写自己的rand函数。实际上rand函数十分简单,你去看看源代码就知道了,照着写一个不过几分钟的事情。
      

  2.   

    把时间作为随机种子srand(time())
    rand()
      

  3.   

    确实有这种应用的,需要保证程序的每次运行都使用完全相同的随机数序列,以保证结果的同一性,例如大型RPG游戏“泰坦之旅”的装备属性生成就使用了这种机制。装备属性是在某个基础值附近的一个范围内随机波动的,但它的存盘文件并不保存各属性波动后的数值,而是仅保存一个seed,每次载入的时候由该seed重新生成具体的属性值。当然,一个RPG游戏所需要用到随机数的地方太多了,正由于它在各处所使用的随机数序列没有分离彻底(例如生成新装备跟载入存盘装备的随机数序列没有分离),导致一个很大的BUG,比如反复打到完全相同的装备。
      

  4.   

    没有办法。只有两个不同线程才能相互不干扰。
    不过你可以写自己的rand函数。实际上rand函数十分简单,你去看看源代码就知道了,照着写一个不过几分钟的事情。 
      

  5.   

    写自己的rand函数,看来这是没办法的办法了,那我先瞧瞧这rand函数的真身原形是什么,咱们自主造一个出来,感谢2楼和楼上!
      

  6.   

    为生成随机数再启动一个线程线程也很简单。int newrand(int srandnum){
    if(srandnum>0){   srand(8);//初始化   }else{
       while(true){       if(){        return  rand();           }else{            Sleep(1000);//避免占用资源
              }   }
    }}
      

  7.   

    随机数并不是真的随机,只是根据随机种子计算出的一系列看似无规律的数而已
    只要种子不变,序列就是确定的通常是用3楼的方法使用随机种子,因为time返回的时间是以毫秒为单位计的,调用sand的时间
    在毫秒级上难以预料,就达到理想的随机效果了
      

  8.   

    受教了另
    随机函数其实很好写
    就一句话
    其中nSeed是种子
    int __cdecl rand (
            void
            )
    {
            return( ((nSeed = nSeed * 214013L
                + 2531011L) >> 16) & 0x7fff );}
      

  9.   

    哈哈,为了 通宵的朋友而回帖,飞鸽传书 - http://www.freeeim.com/