C中的第一次和第二次呼叫

时间:2014-11-18 02:20:04

标签: c

我正在尝试生成一个介于1和6之间的随机数,在每次调用时,假设生成一到六之间的随机数,并且在每个其他调用6上假设要导出到两个指针,我保持如果有人建议如何纠正这个问题。

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

void loadedDice(int*, int*);

int main(void)
{
    int a = 0, b = 0;
    srand(time(NULL));
    loadedDice(&a, &b);
    printf("%d %d\n", a, b);
    loadedDice(&a, &b);
    printf("%d %d\n", a, b);
    loadedDice(&a, &b);
    printf("%d %d\n", a, b);

    return 0;

}


void loadedDice(int* export1, int* export2)
{
    if(*export1 == 6 && *export2 == 6)
    {
    *export1 = 1 + (rand()%6);
    *export2 = 1 + (rand()%6);

    } else {
    *export1 = 6;
    *export2 = 6;
    }
}

3 个答案:

答案 0 :(得分:1)

将您的功能更改为:

void loadedDice(int* export1, int* export2) {
  if (*export1 == 0 && *export2 == 0) {
    *export1 = 1 + (rand() % 6);
    *export2 = 1 + (rand() % 6);
  } else if (*export1 == 6 && *export2 == 6) {
    *export1 = 1 + (rand() % 6);
    *export2 = 1 + (rand() % 6);

  } else {
    *export1 = 6;
    *export2 = 6;
  }
}

现在,由于初始值为0,因此您将在第一次调用时生成随机数。


或者你可以简单地将你的变量初始化为6,这不需要你改变你的功能,建议你做好可读性和维护(保持功能尽可能小)。

此方法需要对代码进行细微更改,特别是您应该将main()中的初始化更改为:

int a = 6, b = 6;

如果您不想初始化变量,那么您可以使用初始化函数,该函数应该为变量分配随机值,而不先执行任何检查(因为值未初始化)。

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

void loadedDice(int*, int*);
void init_loadedDice(int*, int*);

int main(void) {
  int a, b;

  srand(time(NULL));
  init_loadedDice(&a, &b);
  printf("%d %d\n", a, b);
  loadedDice(&a, &b);
  printf("%d %d\n", a, b);
  loadedDice(&a, &b);
  printf("%d %d\n", a, b);

  return 0;

}

void init_loadedDice(int* export1, int* export2) {
  *export1 = 1 + (rand() % 6);
  *export2 = 1 + (rand() % 6);
}

void loadedDice(int* export1, int* export2) {
  if (*export1 == 6 && *export2 == 6) {
    *export1 = 1 + (rand() % 6);
    *export2 = 1 + (rand() % 6);

  } else {
    *export1 = 6;
    *export2 = 6;
  }
}

如果您真的不想使用第二个功能(建议使用)并且不想在main中初始化变量,则可以使用该功能的标志(但我不会&#39 ;看看为什么这样做):

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

void loadedDice(int*, int*, int*);

int main(void) {
  // flag, named 'uninit' will be one
  // as long as 'a' and 'b' are uninitialized
  int a, b, uninit = 1;

  srand(time(NULL));
  loadedDice(&a, &b, &uninit);
  printf("%d %d\n", a, b);
  loadedDice(&a, &b, &uninit);
  printf("%d %d\n", a, b);
  loadedDice(&a, &b, &uninit);
  printf("%d %d\n", a, b);

  return 0;

}

void loadedDice(int* export1, int* export2, int* uninit) {
  if(*uninit) {
    *export1 = 1 + (rand() % 6);
    *export2 = 1 + (rand() % 6);
    *uninit = 0; // change the value of the flag
  } else if (*export1 == 6 && *export2 == 6) {
    *export1 = 1 + (rand() % 6);
    *export2 = 1 + (rand() % 6);

  } else {
    *export1 = 6;
    *export2 = 6;
  }
}

答案 1 :(得分:1)

只需将ab初始化为6而不是0

    int a = 6, b = 6;

答案 2 :(得分:0)

另一种基于G. Samaras的方法回答:

void loadedDice(int* export1, int* export2) {
    static int check = 1;
  if (check == 1) {
    *export1 = 1 + (rand() % 6);
    *export2 = 1 + (rand() % 6);
    check = 0;
  } else if (*export1 == 6 && *export2 == 6) {
    *export1 = 1 + (rand() % 6);
    *export2 = 1 + (rand() % 6);   
  } else {
    *export1 = 6;
    *export2 = 6;
  }