我正在研究一个从给定数组中选取随机数并将它们打印到stdout的函数。这些数字不应重复,并且与数组一起给出函数的数量。我有一个单独的函数测试文件和一个头文件。一切都编译得很好,但是当我运行程序时,我在pickNumbers函数中挂起,没有打印任何内容,我甚至不知道是否有任何选择开始。
#include <stdio.h>
#include <stdlib.h>
#include "head.h"
//program that picks random numbers from the given array
int alreadyPicked(int choices[], int choice);
void pickNumbers(int myArray[],int max)
{
// delcare/initilize variables
int i;
int choices[max];
int length = sizeof(myArray)/sizeof(myArray[0]);
// seed rand
srand(time(NULL));
// pick a random choice until that given number of choices is reached
// to make sure non repeat run against alreadyPicked function
for (i=0; i <= max; i++) {
do{
choices[i] = (rand() % max);
}while (alreadyPicked(choices, choices[i]) == TRUE);
}
for (i=0; i <= max; i++) {
printf("%d", myArray[choices[i]]);
}
printf("\n");
}
int alreadyPicked(int choices[], int choice)
{
int i;
int answer = FALSE;
for (i=0; i <= (sizeof(choices)/sizeof(choices[0])); i++) {
if(choices[i] == choice)
answer = TRUE;
}
return answer;
}
答案 0 :(得分:1)
也许
for (i=0; i <= max; i++) {
必须是:
for (i=0; i < max; i++) {
和
for (i=0; i <= (sizeof(choices)/sizeof(choices[0])); i++) {
必须是:
for (i=0; i < (sizeof(choices)/sizeof(choices[0])); i++) {
答案 1 :(得分:0)
在你的第一个&#34; for&#34;循环你有一个嵌套while / do。你增加&#34;我&#34;在你的for循环中,你应该在while / do中增加变量,否则它将永远挂起执行这样的循环,因为&#34; i&#34;永远不会增加。
替换:
for (i=0; i <= max; i++) {
由:
for (i=0; i < max;) {
并取代:
choices[i] = (rand() % max);
人:
choices[i++] = (rand() % max);
这样你就可以确保&#34;我&#34;正在增加。你的建筑&#34; i&lt; = max&#34;从0开始是不正确的,使用David RF的方式。
答案 2 :(得分:0)
除了前面提到的错误循环测试之外,无限循环的原因是在alreadyPicked()
中你将新的选择索引与choices[]
中的每个选择索引进行比较,包括未初始化的索引和新的一个;因此,alreadyPicked()
始终返回TRUE。我建议更改为alreadyPicked()
致电
alreadyPicked(choices, i)
及其实施
int alreadyPicked(int choices[], int choice)
{
for (int i = 0; i < choice; i++)
if (choices[i] == choices[choice])
return TRUE;
return FALSE;
}