【问题标题】:C++ same values are randomly generating with two for loopsC++ 相同的值是随机生成的,有两个 for 循环
【发布时间】:2019-01-12 04:22:12
【问题描述】:

所以我正在这里处理这个 for 循环:

    for (int i = 0; i < num; i++) {
        for (int i = 0; i < length; i++) {
            Str += randGen();
        }
        cout << Str << endl;
    }
}

对于上下文,整数“长度”是随机生成的字符串大小。这是我的 randGen() 函数:

static const char combination[] =
"0123456789"
"!@#$%^&*"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";

int stringLength = sizeof(combination) - 1;

char randGen() {

    return combination[rand() % stringLength];
}

基本上我的问题是,如果 'num' 大于一,它会打印出每个相同的开始随机生成的部分,并且不会改变。唯一一次有新的随机生成的字符是当“长度”的大小增加时,就是这样。但是,我希望所有的 STR 都完全不同。谁能帮帮我?

--提前谢谢--

【问题讨论】:

  • 你一直追加到同一个字符串。每次打印时,它都会重复前面的前缀加上新添加的字符。也许这就是诱使您认为生成了相同字符的原因。您可能希望在循环之间清除 Str
  • @Igor Tandetnik 是的,我就是这么想的。谢谢,这真的很有帮助。
  • 尝试在拨打rand之前添加srand(time(NULL));。它将根据当前时间为rand 设置种子。这应该只被调用一次(例如在程序的开头)。
  • 在 C++ 中,您应该在 &lt;random&gt; 标头中使用 std::string 和 C++ 随机生成器,因为它们更易于使用。例如,您不会忘记在程序开始时设置种子,因为构建随机生成器需要种子。
  • 在内部和外部循环中为循环控制变量使用相同的变量名是一个非常糟糕的主意。虽然它确实可以编译,但当您必须调试问题时,它会导致一个痛苦的世界。

标签: c++ for-loop random random-seed


【解决方案1】:

如果您想使用 rand() 获得依赖于运行时的输出,您应该根据运行时环境将其设为种子。 正如评论中所建议的,一种简单的方法是在num-loop 之前调用一次srand(time(NULL))

DEMO.

srand(time(NULL));

for (int i = 0; i < num; ++i)
{
    for (int j = 0; j < length; ++j) {
        Str += randGen();
    }
    
    std::cout << Str << std::endl;
}

虽然rand() 通常应该作为 Park-Miller LCG 来实现, 但是,例如,如 C++ 标准草案 n4687 中所述,rand() 中使用的算法完全由编译器实现定义

29.6.9 低质量随机数生成 [c.math.rand]

int rand();
void srand(unsigned int seed);

...rand 的底层算法未指定。因此,rand 的使用仍然是不可移植的,具有不可预测且经常受到质疑的质量和性能。

幸运的是,在 C++11 及更高版本中,我们可以使用&lt;random&gt; 来生成有保证的质量随机性。 因此,我建议您按如下方式使用它们。 如果需要更高质量的随机性,可以使用std::mt19937代替std::minstd_rand

DEMO

#include <random>

static constexpr char combination[] =
"0123456789"
"!@#$%^&*"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";

constexpr int stringLength = sizeof(combination) - 1;
std::minstd_rand gen(std::random_device{}());
std::uniform_int_distribution<std::size_t> dis(0, stringLength-1);

char randGen() {
    return combination[dis(gen)];
}

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 1970-01-01
    • 2013-10-22
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多