c-srand和rand的未定义行为



我正在尝试使用srandrand生成随机数。在这里我要生成具体数字。当我在执行程序时,如果我要求生成5位数字,它不会给我想要的输出。

我的代码是

for(k=0;k<n;k++)
    {
            temp = temp*10;
    }
    srand(time(NULL));
    i = rand()%temp;
    printf("%dn",i);
    k = 0;
    temp = n;
    while(i != 0)
    {
            arr1[n+k] = i%10;
            i = i/10;
            n--;
    }

输出

Number of digits you want : 5
2031
while loop 1
while loop 3
while loop 0
while loop 2
N is 1
arr1[1] = 10651312
arr1[2] = 2
arr1[3] = 0
arr1[4] = 3
arr1[5] = 1

告诉我获取所需位数的问题在哪里。

Edit我运行了大约100次该代码,在这四次中,它不起作用,其余的都很好。。。

问题是循环使用生成的随机数的大小,而不是数组的大小。在您的示例中,您想要五位数字,但您的代码生成了一个四位数字2031。这意味着在底部循环的迭代中

  • 。。。n=2,i=2:存储a[2]=2,i=0
  • 。。。n=1,i=0:循环条件失败,从未设置a[1]

这在a[1]中留下了随机垃圾。如果你的随机数实际上包含5位数字,而不是4位,那么它就会正确地完成循环。

相反,你想在n个上循环

for(int j = n; j > 0; --j)
{
    arr1[n+j] = i%10;
    i = i/10;
}

请注意,这仍然使用基于1的数组,而在c中,数组是基于0的,即它们从元素0开始,即为了使用arr1[5],您需要对6个数组元素或6*sizeof(int)字节进行mallocated或声明。还要注意,应该使用比temp更好的变量名,重用变量没有任何好处:编译器会自动重用寄存器并为您进行排序。

这里有几个问题。

首先,在实际生成随机数之前,先调用srand()一次。

第二,你的方法将返回的数字取10的幂,当然,也会返回更低的数字。例如,n%100000可以是0到99999之间的任意值。

n = rand() % (largest - smallest + 1) + smallest;

如果你想要一个5位数的数字,最小的5位数是多少?对最大的数字执行相同操作。它可以用于任何数字范围,而无需填充数组或任何内容。

现在,您只需要弄清楚如何为指定的位数生成最大值和最小值。

编码快乐!

最新更新