我正在尝试生成一个介于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;
}
}
答案 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)
只需将a
和b
初始化为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;
}