在数组中创建不同的随机数

时间:2015-12-21 21:09:04

标签: c arrays random

我想创建一个包含20个元素的数组,每个元素在闭区间[0-19]中保存不同的整数。

以下是代码块:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SIZE 20

int main() 
{
    srand(time(NULL));

    int array[SIZE]={0}, arrayhold[SIZE]={0}, hold, i;

    for(i=0;i<SIZE;i++) 
    {
        hold = rand()%20+1;

        if(arrayhold[hold]==0)
        {
            array[i]=hold;
            arrayhold[hold]++;
        }
        else 
        {
            while(arrayhold[hold]!=0)
                hold = rand()%20+1;

            array[i]=hold;
        }
    }

    for(i=0;i<SIZE;i++) 
    {
        printf("array[%d]=%d\n",i,array[i]);
    }
}
  

当我运行程序时,输出多次给出数组[random] = 1,但它从不给出数组[random] = 3 (仅作为例子)

Example output

3 个答案:

答案 0 :(得分:0)

从算法的角度来看,像Fisher–Yates shuffle这样的东西可能更好。

无论如何,在给定的代码中

arrayhold[hold]++;
else中缺少

。尝试

else {
    while (arrayhold[hold] != 0)
        hold = rand() % 20 + 1;
    array[i] = hold;
    arrayhold[hold]++; // <--
}

另外,要么避免

中的+ 1
rand() % 20 + 1

[0, SIZE-1]获取值或使用arrayhold[SIZE + 1],因为目前arrayhold已从1编入索引。

事实上,代码可以简化,if是多余的,只需while for就足够了。 (另外,IMO,最好使用作业而不是++。)考虑

for (i = 0; i<SIZE; i++) {
    hold = rand() % SIZE + 1;
    while (arrayhold[hold] != 0)
        hold = rand() % 20 + 1;
    array[i] = hold;
    arrayhold[hold] = 1;
}

答案 1 :(得分:0)

while(arrayhold[hold]!=0)
   hold = rand()%20+1;
array[i]=hold;

这里你正在迭代直到arrayhold [hold]为0.所以你基本上只是想猜测,当hold是一个数字时,arrayhold中的位置是0。显然它是&#39; s 1。

可能的解决方案如下:

for (size_t i = 0; i < SIZE; ++i) {
    array[i] = rand() % 20 + 1;
    int found = 0;
    for (size_t j = 0; j < i; ++j) {
        if (array[j] == array[i]) {
            found = 1;
            break;
        }
    }
    if (!found)
        ++i;
}

c ++中的解决方案正在使用std::random_shuffle。您可以谷歌搜索它的实现并尝试将其翻译为C.

答案 2 :(得分:0)

我能够简化你的逻辑[请原谅无偿的风格清理]。这有效:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 20

int
main()
{
    int array[SIZE] = { 0 };
    int arrayhold[SIZE] = { 0 };
    int j;
    int i;

    srand(time(NULL));

    for (i = 0; i < SIZE; i++) {
        while (1) {
            j = rand() % SIZE;
            if (arrayhold[j] == 0) {
                arrayhold[j] = 1;
                array[i] = j + 1;
                break;
            }
        }
    }

    for (i = 0; i < SIZE; i++) {
        printf("array[%d]=%d\n", i, array[i]);
    }
}