srand和rand的未定义行为

时间:2013-07-03 08:52:16

标签: c linux

我正在尝试使用srandrand生成随机数。在这里,我想生成特定的数字。当我在某个时间执行我的程序时,如果我要求生成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次,在这四次中它不起作用,休息很好......

3 个答案:

答案 0 :(得分:2)

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

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

在[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]你需要malloced或声明6数组元素或6 * sizeof(int)字节。另请注意,您应使用比temp更好的变量名称,并且重用变量没有任何好处:您的编译器将自动重用寄存器并为您排序。

答案 1 :(得分:2)

这里有几个问题。

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

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

答案 2 :(得分:1)

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

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

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

快乐的编码!