我正在尝试使用srand
和rand
生成随机数。在这里我要生成具体数字。当我在执行程序时,如果我要求生成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位数是多少?对最大的数字执行相同操作。它可以用于任何数字范围,而无需填充数组或任何内容。
现在,您只需要弄清楚如何为指定的位数生成最大值和最小值。
编码快乐!