【问题标题】:Infinite Loop where if statements aren't being called不调用 if 语句的无限循环
【发布时间】:2020-05-22 00:49:17
【问题描述】:

我正在尝试编写一段代码,该代码会遍历字符串数组的随机元素,然后将其输出。在它输出之后,然后将该元素设置为 0。然后该 if 语句确保不会再次输出该名称。

void group(){  
  int random =  rand() % 50;
  int i, j = 0;
  while(j<50){ 
    srand(0);
    random =  rand() % 50; 
    groupNum = 1;
    cout << "Group " << groupNum << " has: ";
    if(names[random] != "0"){ 
      cout << names[random] << " "; 
    names[random] = "0"; 
    j++;
    }  
    if(names[random] == "0"){ 
      continue;
    }
    i++; 
    if(i == peoplePerGroup){ 
      groupNum++; 
      cout << "\n\n"; 
      i=0;
      }
    } 
  }  

【问题讨论】:

  • srand(0) 在每个 rand 之前保证 rand 总是产生相同的值。 random 在这里永远不会改变。
  • 你永远不会初始化i。当然这也不是故意的。

标签: c++ arrays string random


【解决方案1】:

srand 函数(作为伪随机数生成器)只应在调用 rand() 和程序开始之前播种一次。不应重复播种,或者每次您希望生成一批新的伪随机数时都重新播种。

“为了生成类似随机的数字,srand 通常被初始化为一些独特的运行时值,例如函数 time 返回的值(在 header 中声明)。这对于大多数琐碎的随机化需求来说已经足够独特了。”

此外,每次您的函数运行时,它都会从您的数组中获取一个随机元素并将其设置为零。此循环结束的唯一方法是在此数组上的每个元素都设置为零的情况下。在每个循环中买入,选择的指数是随机的。想想他们需要运行多少次才能满足您的要求。

【讨论】:

    【解决方案2】:

    解释一下为什么用相同的数字重新播种会导致这个问题: rand() 使用伪随机性,因此它是可重现的。基本上,它会将一些基于种子设置的内部数字网格化。例如,该数字已按位 XOR ( ^ ) 应用于常量等。每次调用后,该数字也在内部递增。 当然,这意味着使用相同的起始编号(也就是种子)每次都会得到相同的结果。

    顺便说一句,如果您将所有单词填充到 std::set 中并在获取单词时将其从集合中删除,而不是将其设置为 null,那么您的整个代码会变得更加流畅。见这里:How to select a random element in std::set?

    或者更简单,将它们填充到向量中并应用:std::random_shuffle 然后只需遍历该向量一次,以随机顺序接收单词。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 2022-12-31
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多