【问题标题】:Generate random string of numbers of random length生成随机长度的数字的随机字符串
【发布时间】:2018-01-25 13:52:42
【问题描述】:

我正在尝试为我的程序自动化测试用例,我想生成随机的数字字符串来测试...第一个测试将使用基数 2 的数字,所以我想生成随机的 0 和 1长度 n,其中 n 是从 1 到 100。这是我到目前为止所拥有的,它一直返回相同的字符串(相同的长度)并且只为字符串的整个长度生成 1 或 0。

int digNum = rand() % 100 + 1;
int num;

for(int i = 0; i < digNum; i++) {
    num = ((double) rand() / (RAND_MAX)) + 1;
    s1 = s1 + to_string(num);
}
cout << s1 << endl;

想法?

【问题讨论】:

  • 你有没有初始化srand,即调用类似srand (time(NULL))的东西?
  • 想一想(double) rand() / (RAND_MAX) 做了什么。然后想想当你将它转换为整数时会发生什么。
  • 你应该看看random标准库(从c++11开始可用)——它比rand()更通用。

标签: c++ string random


【解决方案1】:

或者,如果您有 C++11 或更高版本,您可以使用 &lt;random&gt; 生成字符串。

#include <iostream>
#include <chrono>
#include <random>
#include <algorithm>

int genRandom(std::mt19937 & mt, int ls, int rs)
{
    std::uniform_int_distribution<int> distribution(ls, rs);
    return distribution(mt);
}

int main()
{
    std::mt19937 mt_rand;
    auto seed = std::chrono::high_resolution_clock::now().time_since_epoch().count();
    mt_rand.seed(static_cast<unsigned>(seed));

    std::string randomString(genRandom(mt_rand, 0, 100), ' ');
    std::generate(std::begin(randomString), std::end(randomString), [&] () { return '0' + (genRandom(mt_rand, 0, 1)); });
    std::cout << randomString << std::endl;
    return 0;
}

【讨论】:

    【解决方案2】:

    首先你应该初始化生成器,例如:

    srand(time(NULL));
    

    这样,您将确保不会每次都得到相同的数字。

    为了从范围内生成数字,您应该尝试:

    rand() % (max + 1 - min) + min
    

    【讨论】:

    • 每次调用rand()/RAND_MAX,它都会给你一个介于0和1之间的数字。所以你只需要判断这个数字是否大于0.5,则为1,如果小于则它是 0。
    【解决方案3】:

    对于 0/1 问题:

    num = rand()%2;

    将更简单地生成一个 0 或 1 的数字。 使用您当前的表达式,rand()/RAND_MAX 始终

    对于恒定的结果

    即使 rand() 返回一个伪随机序列,默认情况下它总是会在程序启动时生成相同的序列。如果您在同一个程序中再次调用它,结果会有所不同,因为您在随机数序列中前进。如果你希望每个进程的第一次调用 rand() 运行你返回不同的结果,你必须调用

    srand(time(NULL));
    

    在调用 rand() 之前

    【讨论】:

    • 所有很好的答案,感谢所有人。这个答案很好解释,谢谢
    【解决方案4】:

    如果你将 srand() 函数除以 RAND_MAX,你会得到一个 0..1 的数字,而通过转换为整数,你会在很多情况下得到 0(由于截断)。最后 0 + 1 是 1。

    也许你需要这样的东西:
    rand() % (base) 即rand() % (2)

    别忘了初始化随机数生成器:
    srand(time(NULL));

    【讨论】:

      【解决方案5】:

      您可以使用std::uniform_int_distribution 生成整数值。

      #include <random>
      #include <string>
      
      template <typename Generator>
      std::string random_binary_string(Generator& g, std::size_t n) {
          std::uniform_int_distribution<char> d('0', '1');
      
          std::string s;
          s.reserve(n);
      
          for (std::size_t i = 0; i < n; ++i) {
              s += d(g);
          }
      
          return s;
      }
      
      template <typename Generator>
      std::size_t random_size(Generator& g, std::size_t a, std::size_t b) {
          std::uniform_int_distribution<std::size_t> d(a, b);
          return d(g);
      }
      

      std::random_device 通常会生成不确定的随机数。

      #include <iostream>
      
      int main() {
          std::random_device g;
          std::cout << random_binary_string(g, random_size(g, 1, 100)) << std::endl;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-13
        • 1970-01-01
        • 2017-08-01
        • 2011-06-30
        • 2023-04-06
        • 2021-03-15
        相关资源
        最近更新 更多