我试图在循环内生成一个长度为16
的随机数组。数组的元素将位于[0, 255]
内。我认为从[0, 255]
分配随机整数就足够了;但它不起作用(创建一个随机数组,它在迭代时保持不变)。然后我尝试了改组,但情况没有改善(我也注意到'随机'数组中0
的概率明显更大。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//#define Shuffle
/* Generate a random integer array of length `size` with elements from [0, 255] */
int* random_sample(int size)
{
int i, j, k;
int *elements = malloc(size*sizeof(int));
/* Assign random integers */
for (i = size - 1; i > 0; --i)
{
elements[i] = rand() % 256;
}
/* Shuffle */
#ifdef Shuffle
for (i = size - 1; i > 0; --i) {
j = rand() % size;
k = elements[i];
elements[i] = elements[j];
elements[j] = k;
}
#endif
return elements;
}
int main(int argc, char const *argv[])
{
int LENGTH = 16, i, iteration;
int *random_array = random_sample(LENGTH);
srand(time(NULL));
for (iteration = 0; iteration < 10; ++iteration)
{
for (i = 0; i < LENGTH; ++i)
printf("%d, ", random_array[i]);
puts("");
}
return 0;
}
典型输出如下:
0, 227, 251, 242, 171, 186, 205, 41, 236, 74, 255, 81, 115, 105, 198, 103,
0, 227, 251, 242, 171, 186, 205, 41, 236, 74, 255, 81, 115, 105, 198, 103,
0, 227, 251, 242, 171, 186, 205, 41, 236, 74, 255, 81, 115, 105, 198, 103,
0, 227, 251, 242, 171, 186, 205, 41, 236, 74, 255, 81, 115, 105, 198, 103,
0, 227, 251, 242, 171, 186, 205, 41, 236, 74, 255, 81, 115, 105, 198, 103,
0, 227, 251, 242, 171, 186, 205, 41, 236, 74, 255, 81, 115, 105, 198, 103,
0, 227, 251, 242, 171, 186, 205, 41, 236, 74, 255, 81, 115, 105, 198, 103,
0, 227, 251, 242, 171, 186, 205, 41, 236, 74, 255, 81, 115, 105, 198, 103,
0, 227, 251, 242, 171, 186, 205, 41, 236, 74, 255, 81, 115, 105, 198, 103,
0, 227, 251, 242, 171, 186, 205, 41, 236, 74, 255, 81, 115, 105, 198, 103,
我尝试了上述代码的几种变体,但它们都不起作用。需要帮助!
修改
我正在尝试代码的变体,并错误地打印了相同的未更改的数组(正如其他人指出的那样 - 多亏了它们);我最初写的
int main(int argc, char const *argv[])
{
int LENGTH = 16, i, iteration;
int *random_array;
srand(time(NULL));
for (iteration = 0; iteration < 10; ++iteration)
{
random_array = random_sample(LENGTH);
for (i = 0; i < LENGTH; ++i)
printf("%d, ", random_array[i]);
puts("");
}
return 0;
}
打印更多0
s。
编辑(2)
感谢@pmg,我发现了问题。在random_sample
内部功能,更改第一个
for (i = size - 1; i > 0; --i)
到for (i = size - 1; i >= 0; --i)
工作正常!
谢谢大家。
答案 0 :(得分:3)
尝试以下代码。要使数组在每次迭代时包含不同的(随机)值,您需要在其中添加不同的值:)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//#define Shuffle
/* Generate a random integer array of length `size` with elements from [0, 255] */
int* random_sample(int size)
{
int i, j, k;
int *elements = malloc(size*sizeof(int));
/* Assign random integers */
for (i = size - 1; i > 0; --i)
{
elements[i] = rand() % 256;
}
/* Shuffle */
#ifdef Shuffle
for (i = size - 1; i > 0; --i) {
j = rand() % size;
k = elements[i];
elements[i] = elements[j];
elements[j] = k;
}
#endif
return elements;
}
int main(int argc, char const *argv[])
{
int LENGTH = 16, i, iteration;
int *random_array;
srand(time(NULL));
for (iteration = 0; iteration < 10; ++iteration)
{
random_array = random_sample(LENGTH);
for (i = 0; i < LENGTH; ++i)
printf("%d, ", random_array[i]);
puts("");
free(random_array);
}
return 0;
}
答案 1 :(得分:2)
以下是对您的代码的一些评论,以澄清问题。
int main(int argc, char const *argv[])
{
int LENGTH = 16, i, iteration;
int *random_array = random_sample(LENGTH); // ARRAY is created and filled in here.
srand(time(NULL)); // Random generator is initialized here.
// WAIT WHAT? You already filled in the array above!
// It is too late now to initialize the Generator!
答案 2 :(得分:1)
除了上面其他人所说的内容之外,我认为重要的是要注意手册页中所写的rand
函数的以下内容:
注意:强> Linux C库中的rand()和srand()版本使用与random(3)和srandom(3)相同的随机数生成器,因此低阶位应与高阶位一样随机位。但是,在较旧的rand()实现以及不同系统上的当前实现中,低阶位比高阶位更不随机。当需要良好的随机性时,请勿在可移植的应用程序中使用此功能。 (改为使用随机(3)。)
有两种可能的选择:
1)使用笔记建议的random
功能。
2)使用随机数的高位,如下所示:
elements[i] = (rand() * 256) / RANDMAX;