c - 当我尝试生成每个数字都不同的 4 位整数时出现奇怪的模式

标签 c function random

当我尝试用 C 语言编写一个小程序,旨在生成一个 4 位整数,其中每个数字都不同且非零时,返回的值始终采用 1abc 之类的模式:第一个数字似乎始终是1,有时返回的值会超过4位,如56127254。有人能帮我研究一下吗?预先非常感谢您。

所以基本上该程序包含两个函数,int isvalid(int n)int Choose_N(void)

如果整数恰好由 4 个十进制数字组成,并且所有这些数字均非零且不同,则

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/

相关文章:

function - 没有参数类型的过程声明的行为是什么?

javascript - point.dist = function () { ^ ReferenceError : points is not defined

python - Random.randint 在 Python 中不生成随机数

c++ - Mersenne Twister 与 Mersenne Twister 64 位

c - 基本的 C 格式问题

c - 在设备驱动程序中使用 stdlib.h

c - 使用线程的多文件访问

c - C中的未知值链表

php - 使用 MySQL 或 PHP 随机化结果更好吗?

javascript - 如果在 map 函数: Getting unexpected error内