【问题标题】:While never ends with random number虽然永远不会以随机数结尾
【发布时间】:2013-11-23 18:34:27
【问题描述】:

我正在尝试获取一个随机数,如果它超过另一个数字,则让 while 结束:

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

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

while 开始良好并生成不同的数字(如 1.000 乘以 11、1.000 乘以 75...),但它永远不会结束。

我有两个问题,为什么没有结束? 为什么它会在控制台中输入相同随机数的 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);整个代码不再起作用了。

【问题讨论】:

  • 除了其他答案,你应该用一个值初始化i
  • +1 用于提供SSCCE
  • Fabian,int i = rand()%100 正在遮蔽int i 的外部声明。如果您将其替换为i = rand() % 100,您的第一个片段将正常工作。

标签: c random while-loop


【解决方案1】:

你在这里重新声明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)

【讨论】:

    【解决方案2】:

    您正在循环内播种随机数生成器,以秒为单位的时间作为种子。这将重置随机数生成器,因此它将始终返回相同的数字,直到 time(0) 返回不同的值(即,一秒钟过去了)。将播种移出循环。

    还要从循环内的int i 中删除int,否则循环内的i 与您在循环条件中检查的i 不同,这将导致循环从@ i > x 中的 987654325@ 永远不会改变。

    最后,初始化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);
    }
    

    【讨论】:

    • 但在这一点上,时间也永远不会结束?
    • @FabianBoulegue 它永远不会结束,因为条件中的i 从未分配给,因为循环内有一个新的int i。根据我的答案中的代码删除int
    • 啊好的 :) 谢谢,您是否也有一个想法:为什么我在控制台中输入相同随机数的 1.000 倍,然后是下一个随机数的 1.000 倍?
    • @FabianBoulegue 因为您使用相同的种子为随机数生成器播种 1 秒。根据我的答案中的代码,将srand 移到循环之外。
    • 好的,我明白了,这是在 c 中生成随机数的“好方法”吗?
    【解决方案3】:

    因为您每次都使用几乎相同的编号进行播种:time(0) 在更新之前将返回相同的编号大约一千次循环。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      • 2020-01-02
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 2015-12-29
      相关资源
      最近更新 更多