在数组中创建实际的随机数据

时间:2014-04-15 23:48:00

标签: c arrays random

我一直致力于一项任务,我必须创建一定数量的数组并用随机数据填充它们。我想要遵循的方法是我希望数组填充数据,只需要一个百分比。问题在于,对于每个数组,随机值都处于相同的位置,而不是按照我想要的方式进行扩展。

我一直在用这种方式创建数组:

int **array = malloc(DOC * sizeof *array);
for (i = 0; i < DOC; i++)
{
    array[i] = malloc(MAXWORDS * sizeof **array);
}

并使用以下方法填写:

srand((unsigned) time(&t));

for(i = 0; i < DOC; i++){
    for(j = 0; j < MAXWORDS; j++){
        array[i][rand() %percentage]=rand() %VALUE;
    }
}

其中

int percentage = rand() %MAXWORDS/10;

MAXWORDS定义数组的长度 DOC数组的数量 VALUE是最大随机值

As you can see the random values are all behaving identically. 我知道这与srand取决于生成数字的时间的方式有关,并且程序的执行非常快,因此类似的数据是因为“相似”的时间。所以我要问的是,要么在不同的一天生成随机值,要么我可以用不同的技巧来填充数组。

3 个答案:

答案 0 :(得分:1)

rand()srand(),尤其是与%一起使用时,它们不会像您想象的那样生成均匀分布的随机数。

Mersenne twister算法检查为备用伪随机数生成器。

答案 1 :(得分:1)

使用&#34; rand()%百分比&#34;你只是在每个数组的前10%内挑选元素。相反,你可能想要这样的东西:

for (i = 0; i < DOC; ++i){
    for (j = 0; j < MAXWORDS; ++j) {
        if (rand() % 100 <= 10) {
            array[i][j] = rand() % VALUE;
        }
    }
}

这使得数组中的每个元素大约有10%的可能性被初始化,这将导致(对于足够大的数组)大约10%的元素被初始化。

如果你想要初始化10%的数组,你可以做一些事情,比如把所有索引(0 ... j)放到一个数组中,随机化数组,然后从中选择第一个MAXWORDS / 10索引。用于初始化的随机数组。

答案 2 :(得分:0)

我认为问题在于您如何选择第二个索引:rand() % percentage将始终填充到数组的前面。

C中的标准随机数生成器(srand + rand)在生成通过随机性统计测试的数字时往往非常糟糕。有更复杂的随机数生成器可以提供更好的属性作为GNU Scientific Library的一部分,您可能会发现它们很有帮助。