我正在尝试获取一个随机数,并且如果它超过另一个数字,则使用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);整个代码不再起作用了。
答案 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()
之前。