虽然永远不会以随机数结尾

时间:2013-11-23 18:34:27

标签: c random while-loop

我正在尝试获取一个随机数,并且如果它超过另一个数字,则使用while结尾:

int main() // random
{
    int x= 50;
    int i;

    while (i>x){
        srand(time(0));
        int i = rand() %100;
        printf("laenge %d", i);
    }
}

同时开始很好并产生不同的数字(如1.000倍11,1.000乘75 ......)但它永远不会结束。

我有2个问题,为什么不结束? 为什么它会在控制台中获得相同随机数的1.000倍,然后是下一个随机数的1.000倍?

如果我添加:

int main() // random
{
    int x= 50;
    int i;

    while (i>x){
        srand(time(0));
        int i = rand() %100;
        printf("laenge %d", i);
        sleep(1);
    }
}

睡眠(1);整个代码不再起作用了。

3 个答案:

答案 0 :(得分:6)

您在此重新声明i

int i = rand() %100;
^^^

所以它是一个不同的i,然后用来检查 while循环

while (i>x){

这也意味着您需要在第一个声明中初始化i,因为使用未初始化的变量是undefined behavior

你应该只调用srand一次,所以把它移到循环之外。另外,从 C FAQ 中阅读How can I get random integers in a certain range?也是一个好主意。在[M, N]范围内生成随机整数的推荐公式为:

M + rand() / (RAND_MAX / (N - M + 1) + 1)

在你的情况下将是:

rand() / (RAND_MAX / (100 + 1) + 1)

答案 1 :(得分:4)

您正在循环中为随机数生成器播种,并以秒为单位作为种子。这会重置随机数生成器,因此它将始终返回相同的数字,直到time(0)返回不同的值(即,第二个已经过去)。将播种移到循环外。

同样从循环内的int中删除int i,否则循环内部将有一个i,而不是你在循环条件中检查的i,这会导致循环永远不会结束,因为i > x中的i永远不会改变。

最后,初始化do,以便在循环首次启动时它具有已知值。 (或者将循环更改为while - int x = 50; int i = 51; // <- initialize srand(time(0)); // <- seed outside loop while (i > x) { i = rand() %100; // <- use the same 'i' inside and outside loop printf("laenge %d", i); } ,以便条件结束。)

{{1}}

答案 2 :(得分:1)

因为您每次播种的数字几乎相同:time(0)将在更新前返回大约一千个循环的相同数字。

解决方案:从循环中移除srand(time(0))并将其放在while()之前。