在C中的循环中生成随机的整数数组

时间:2014-04-17 15:42:56

标签: c arrays random

我试图在循环内生成一个长度为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)工作正常!

谢谢大家。

3 个答案:

答案 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;