Random 用同一种子生成不同的随机数

Random 用同一种子生成不同的随机数,random,cuda,Random,Cuda,我正在使用CURAND库在CUDA中编写随机生成代码。我读到的关于随机生成的内容让我相信,如果我使用相同的种子,我将得到相同的随机数集。但当我测试它时,情况并非如此。请解释我做错了什么。我粘贴以下代码以供参考: 输出: 0:624778773 1 : 3522650202 2 : 2363946744 3 : 1266286439 4 : 3928747533 5 : 3732235839 6 : 1382638835 7 : 3362343509 8 : 48542993 9 : 122599

我正在使用CURAND库在CUDA中编写随机生成代码。我读到的关于随机生成的内容让我相信,如果我使用相同的种子,我将得到相同的随机数集。但当我测试它时,情况并非如此。请解释我做错了什么。我粘贴以下代码以供参考:

输出:

0:624778773 1 : 3522650202 2 : 2363946744 3 : 1266286439 4 : 3928747533 5 : 3732235839 6 : 1382638835 7 : 3362343509 8 : 48542993 9 : 1225999208 ------0----------- 0 : 3356973615 1 : 1004333919 2 : 2916556602 3 : 1213079917 4 : 2705410958 5 : 520650207 6 : 1860816870 7 : 1645310928 8 : 2205755199 9 : 1282999252
------1------

有一个关于伪随机发生器状态的概念。例如,Mersenne twister的状态大小约为1024个字,而默认的one XORWOW的状态大小仅为几个字,但其周期也小得多

无论何时调用“setPseudoRandomGeneratorSeed”,都会初始化生成器的状态。然后,随着对curandGenerate的后续调用,该状态将被更新,即从一个随机数转到下一个随机数,该状态需要重新计算,因此将生成随机序列的不同部分


您还可以尝试使用驱动程序API—在这里,curandInit初始化每个线程的状态,这可能非常昂贵。然后,对curand或curandUniform等的后续调用将重用此状态。事实上,每个线程从随机序列的不同偏移量开始

有一个伪随机生成器状态的概念。例如,Mersenne twister的状态大小约为1024个字,而默认的one XORWOW的状态大小仅为几个字,但其周期也小得多

无论何时调用“setPseudoRandomGeneratorSeed”,都会初始化生成器的状态。然后,随着对curandGenerate的后续调用,该状态将被更新,即从一个随机数转到下一个随机数,该状态需要重新计算,因此将生成随机序列的不同部分


您还可以尝试使用驱动程序API—在这里,curandInit初始化每个线程的状态,这可能非常昂贵。然后,对curand或curandUniform等的后续调用将重用此状态。事实上,每个线程从随机序列的不同偏移量开始

线程的调用是非常随机的,因此即使在主机上设置了种子,每次运行都会生成不同的序列。

线程的调用是非常随机的,因此即使在主机上设置了种子,每次跑步都会产生不同的序列。

谢谢您的回答。那么你的意思是说我不需要为不同的随机数生成不同的种子,即使我使用相同的种子,我也会得到不同的随机数集?是的,没有必要为每次调用curandGenerate生成随机种子。你可以在每次程序运行时设置一个种子,例如使用“timeNULL”,我想我已经得到了解释。cuRandGenerator不会在每次播种时重置偏移量,因此我会得到不同的随机值集。如果我在循环中创建并销毁生成器,那么我会得到相同的随机值集。谢谢你的回答。那么你的意思是说我不需要为不同的随机数生成不同的种子,即使我使用相同的种子,我也会得到不同的随机数集?是的,没有必要为每次调用curandGenerate生成随机种子。你可以在每次程序运行时设置一个种子,例如使用“timeNULL”,我想我已经得到了解释。cuRandGenerator不会在每次播种时重置偏移量,因此我会得到不同的随机值集。如果我在循环中创建并销毁生成器,那么我会得到相同的随机值集。
    curandGenerator_t rand_gen;  
    status = curandCreateGenerator (&rand_gen ,CURAND_RNG_PSEUDO_DEFAULT );  
    if(status != CURAND_STATUS_SUCCESS){  
            printf("Error encountered in generating handle\n");  
    }  
    status = curandSetPseudoRandomGeneratorSeed (rand_gen ,1234ULL);  
    if(status != CURAND_STATUS_SUCCESS){  
            printf("Error encountered in setting seed\n");  
    }  

    for(j=0; j<2; j++){  
            status = curandGenerate(rand_gen,a_d,N);  
            if(status != CURAND_STATUS_SUCCESS){  
                    printf("Error encountered in generating random numbers\n");  
             }

            cudaMemcpy ( a_h , a_d , N * sizeof(unsigned int),cudaMemcpyDeviceToHost);  
            for(i = 0; i < N; i++){  
                    printf("%d : %u\n",i,a_h[i]);  
            }
            printf("-----------%d----------------------\n",j);  
    }  
    status = curandDestroyGenerator(rand_gen);  
    if(status != CURAND_STATUS_SUCCESS){  
            printf("Error encountered in destroying handle\n");  
    }