从数组中打印随机选择

时间:2013-01-09 10:10:16

标签: c arrays function loops while-loop

我正在研究一个从给定数组中选取随机数并将它们打印到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;
} 

3 个答案:

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