【问题标题】:C++ Randomize Different Variables Using a Constructor [duplicate]C ++使用构造函数随机化不同的变量[重复]
【发布时间】:2017-04-27 18:33:43
【问题描述】:

机器人::机器人()

fitness = 5; totalBattery = 5; int randNum; int i = 0; bool valid = true; srand(time(NULL)); //get robot's position on board and check to see if it is not starting on the wall while (valid) { position = (rand()+i++) % 196; if (position >= 0 && position <= 14) { } else if ((position % 14) == 0 || (position % 14) == 13) { } else if (position >= 183 && position <= 195) { } else { valid = false; cout << endl << "MY POSITION IS : " << position << endl << endl; } } //randomize Robot Genetics for (int j = 0; j < genes; j++) { for (int k = 0; k < chromosomes; k++) { //first 4; set N S E W(what the robot looks for in that direction) //0 = empty; 1 = battery; 2 = don't care; 3 = wall if (k < 4) { randNum = ((rand()+i++) % 4); switch(randNum) { //Empty Space case 0: DNA[j][k] = " * "; break; //Battery case 1: DNA[j][k] = " B "; break; //Don't Care case 2: DNA[j][k] = " D "; break; //Wall case 3: DNA[j][k] = " W "; break; default: cout << "YOUR CODE SCREWED UP IF YOU ARE IN HERE!! " << endl; } } //direction facing; N S E W else if (k < 5) { randNum = ((rand()+i++) % 4); switch(randNum) { case 0: DNA[j][k] = "N"; break; case 1: DNA[j][k] = "S"; break; case 2: DNA[j][k] = "E"; break; case 3: DNA[j][k] = "W"; break; default: cout << "YOUR CODE SCREWED UP IF YOU ARE IN HERE!! " << endl; break; } } //step counter in that direction else if (k < 6) { DNA[j][k] = "0"; } //Rotate Right(R); Rotate Left(L); Move in facing Direction(M); Do Nothing (X) else { randNum = ((rand()+i++) % 4); switch(randNum) { case 0: DNA[j][k] = "X"; break; case 1: DNA[j][k] = "L"; break; case 2: DNA[j][k] = "R"; break; case 3: DNA[j][k] = "M"; break; default: cout << "YOUR CODE SCREWED UP IF YOU ARE IN HERE!! " << endl; break; } } } }

}

我正在尝试构造一个类的对象,我需要 200 个。我正在使用一个向量并遍历一个while循环,每次我构造一个新的类实例时,对象都会得到完全相同的数据。在构造类的对象时,您应该如何正确使用 randomizer 函数将不同的数据转换为变量?我尝试进行研究,但它只是让我到了这一点,我不确定为什么这不起作用。提前谢谢你。

【问题讨论】:

  • 为不可能的事情添加默认情况真的很荒谬。如果您以某种方式将值 mod 4 设为 >3,则您的计算机已损坏。这不是代码问题。
  • @tadman:保护自己免受未来可能产生意外后果的代码更改的影响是很常见的。此外,虽然表达式n % 4(假设这里是内置类型)不能产生大于 3 的值,但它肯定可以产生小于 0 的值。
  • @BenjaminLindley 这是最糟糕的防御性编程形式。如果发生这种情况真的很糟糕,abort()

标签: c++ class object constructor srand


【解决方案1】:

很可能您生成对象的速度太快了。如果每次调用构造函数时time() 方法产生相同的值,它将产生相同的“随机”值。

如果您在程序启动时只调用一次srandrand() 将为每个对象生成不同的值。

【讨论】:

  • 我假设如果我遍历一个 i 值,将其递增 1,那么每次随机化时,该值不可能相同。您是否建议我将 srand 放在构造函数之外?
  • @Rwal27 “你是否建议我将 srand 放在构造函数之外?” 正如重复答案中所述,您应该在运行程序时只调用一次 srand() .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 2019-04-07
  • 2015-10-04
  • 1970-01-01
相关资源
最近更新 更多