我想创建一个包含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 (仅作为例子)。
答案 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]);
}
}