-1

我正在尝试使用srandand生成随机数rand。在这里,我想生成特定的位数。当我在某个时间执行我的程序时,如果我要求生成 5 位数字,它不会给我想要的输出。

我的代码是

for(k=0;k<n;k++)
    {
            temp = temp*10;
    }
    srand(time(NULL));
    i = rand()%temp;
    printf("%d\n",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 次,在这四次中它不起作用,休息很好......

4

3 回答 3

2

这里有几个问题。

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

其次,您的方法将返回的数字取模 10 的某个幂,当然,也会返回较低的数字。例如,n%100000 可以是 0 到 99999 之间的任何值。

于 2013-07-03T09:00:24.297 回答
2

问题是您循环的是您生成的随机数的大小,而不是数组的大小。在您的示例中,您需要五位数字,但您的代码生成了一个四位数字 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) 字节。另请注意,您应该使用比 更好的变量名temp,并且重用变量没有任何好处:您的编译器将自动重用寄存器并为您排序。

于 2013-07-03T08:58:50.643 回答
1
n = rand() % (largest - smallest + 1) + smallest;

如果你想要一个 5 位数字,那么最小的 5 位数字是多少?对最大的数字做同样的事情。这可以用于任何数字范围,无需填充数组或任何东西。

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

快乐编码!

于 2013-07-03T09:10:30.107 回答