【发布时间】:2019-09-12 07:49:15
【问题描述】:
我需要使用 cuda 在 (A,B) 范围内生成 N 个唯一的随机整数。我希望它们均匀分布,但我不知道这是否与每个数字唯一的必要性相冲突。
之前有人问过这个问题,但没有任何答案,并带有编码提示。
如何在一个区间内生成固定数量的唯一随机整数而不重复?
我的尝试如下生成随机数,但它们不是唯一的。
#include <stdio.h>
#include <curand.h>
#include <curand_kernel.h>
#include <math.h>
#include <assert.h>
__global__ void setup_kernel ( curandState * state, unsigned long seed )
{
int id = threadIdx.x;
curand_init ( seed, id, 0, &state[id] );
}
__global__ void generate( curandState* globalState, int * result, int *max, int *min, int count )
{
int ind = threadIdx.x;
curandState localState = globalState[ind];
float RANDOM = curand_uniform( &localState );
globalState[ind] = localState;
if (ind < count)
result[ind] = truncf(*min +(*max - *min)*RANDOM);
}
int main( int argc, char** argv)
{
int N = 32; // no of random numbers to be generated
int MIN = 10; // max range of random number
int MAX = 100; // min range of random number
dim3 tpb(N,1,1);
curandState* devStates;
cudaMalloc ( &devStates, N*sizeof( curandState ) );
// setup seeds
setup_kernel <<< 1, tpb >>> ( devStates, time(NULL) );
int *d_result, *h_result;
cudaMalloc(&d_result, N * sizeof(int));
h_result = (int *)malloc(N * sizeof(int));
int *d_max, *h_max, *d_min, *h_min;
cudaMalloc(&d_max, sizeof(int));
h_max = (int *)malloc(sizeof(int));
cudaMalloc(&d_min, sizeof(int));
h_min = (int *)malloc(sizeof(int));
*h_max =MAX;
*h_min =MIN;
cudaMemcpy(d_max, h_max, sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(d_min, h_min, sizeof(int), cudaMemcpyHostToDevice);
// generate random numbers
generate <<< 1, tpb >>> ( devStates, d_result, d_max, d_min, N );
cudaMemcpy(h_result, d_result, N * sizeof(float), cudaMemcpyDeviceToHost);
for (int i = 0; i < N; i++)
printf("random number= %d\n", h_result[i]);
return 0;
}
20, 39, 43, 72, 39, 70, 58, 31, 44, 47, 30, 26, 42, 35, 20, 66, 94, 81, 42(repeated), 50, 90, 31(repeated), 51, 53, 39(repeated), 20, 66, 37, 42(repeated), 21, 45, 57
【问题讨论】:
-
(伪)随机数生成器不会产生唯一的数字。这不是他们的设计目的。它们被设计成产生具有很长周期的数字序列。序列中的数字不是唯一的。 sqeuences 本身被设计为具有如此长的周期,以至于 sequences 接近于 unqiueness。听起来您想随机采样一系列唯一整数,这是完全不同的事情(即类似于this)
-
这个问题可能与stackoverflow.com/q/12653995/681865重复
-
称为shuffle - Fisher-Yates-Knuth 范围的shuffle,从shuffle中返回前N个项目
标签: random cuda integer unique