当我尝试用 C 语言编写一个小程序,旨在生成一个 4 位整数,其中每个数字都不同且非零时,返回的值始终采用 1abc 之类的模式:第一个数字似乎始终是1,有时返回的值会超过4位,如56127254。有人能帮我研究一下吗?预先非常感谢您。
所以基本上该程序包含两个函数,int isvalid(int n)
和 int Choose_N(void)
。
isValid
返回 1,否则返回 0。
并且 int Choose_N(void)
生成一个 4 位整数,并且所有数字都是不同的且非零。
这是我的代码:
#define N_DIGITS 4
....
....//the main function
int isvalid(int n){
int i, x; int check[N_DIGITS]={0};
for(i=1;i<=N_DIGITS;i++){ //check whether all digits are nonzero
if((check[i-1]=n%10)==0){
return 0;
}
n /= 10;
}
for(i=0;i<N_DIGITS-1;i++){ // check whether all digits are distinct
for(x=i+1;x<N_DIGITS;x++){
if(check[i]==check[x])
return 0;
}
}
return 1;
}
int choose_N(void){
int i; int number=0;
while(!isvalid(number)){
for(i=0;i<N_DIGITS;i++){
srand(time(0));
number += ((10^i)*(rand()%10));
}
}
return number;
}
对于 srand(time(0));
,我尝试了各种替代方案,例如 srand(time(0)+i);
或将此语句放在 while
循环,但这些尝试似乎不起作用,并且 choose_N
的返回值仍然显示出我所描述的奇怪模式。
最佳答案
您的 choose_N
方法有几个问题:
- 首先,如果数字无效,您不会将其重置为
0
,因此它只会不断增长。 - 其次,
srand(time(0))
在循环中不是必需的(并且可能会在多次迭代中产生相同的结果),只需在程序开始时执行即可 ( srand() — why call it only once? )< - 第三个也是最大的错误:
10 ^ i
是 10 xor i,而不是10**i
。您可以在循环中使用 aux 值并乘以 10。由于位数很少,因此没有溢出的风险 - 小备注:您希望至少在循环中传递一次,因此请使用
do/while
构造,这样您就不必强制执行第一个while
测试。
我正在尝试修复您的代码:
int choose_N(void){
int i, number;
do
{
number = 0;
int p = 1;
for(i=0;i<N_DIGITS;i++)
{
number += p*(rand()%10);
p *= 10;
}
} while(!isvalid(number));
return number;
}
关于c - 当我尝试生成每个数字都不同的 4 位整数时出现奇怪的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47434431/