【问题标题】:Trying to Generate Random Numbers in a Specific Range in C++尝试在 C++ 中生成特定范围内的随机数
【发布时间】:2020-08-01 12:15:47
【问题描述】:

我正在尝试生成 10 个随机生成的数字的列表,范围在 100000 到 583662 之间,并且我尝试过的每件事都会导致所有数字都以 1 开头,并且不会生成高于 199999 的数字。我实际上已经生成了 1000 个数字,看看它是否只是一个样本太小,但在 1000 个数字中,我应该至少有几个数字高于 199999,但没有一个。这是我一直在使用的代码:

    #include <stdio.h>
    #include <cstdlib>
    #include <ctime>
    #define SIZE 100

    int main()
    {
        int globalArray[SIZE] = {0};
        srand((unsigned)time(0));
        int count;
        for (int count = 0; count < 100; ++count) {
            globalArray[count] = (rand() % 483662) + 100000;
        }
        for (int count = 0; count < 100; ++count) {
            printf("%d\n", globalArray[count]);
        }
        return 0;
    }

【问题讨论】:

标签: c++ arrays random


【解决方案1】:

你应该使用:

rand() / (float)RAND_MAX * range

从平台到平台,RAND_MAX 会有所不同。如果您的 RAND_MAX 小于 483662,您将无法获得完整的范围。

另一种选择是:

(rand() + rand() * RAND_MAX) % range

【讨论】:

  • 这只是隐藏了rand 没有产生足够熵的潜在问题。您会得到分散的数字,但只能生成该范围内的一小部分数字。
  • 好点。可能仍然有用,具体取决于使用数字的域。
【解决方案2】:

您可以使用新的&lt;random&gt; 库代替std::rand 并提高代码的可读性:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <random>

int main()
{
    std::mt19937 engine{std::random_device{}()};
    std::uniform_int_distribution dist{100000, 583662}; // inclusive

    std::generate_n(std::ostream_iterator<int>{std::cout, "\n"}, 1000,
                    [&] { return dist(engine); });
}

(live demo)


根据评论将数字生成到数组中:

std::generate_n(globalArray, SIZE, [&] { return dist(engine); });

或:

std::generate(std::begin(globalArray), std::end(globalArray), [&] { return dist(engine); });

使用 C++20 范围或范围-v3 更简单:

namespace ranges = std::ranges; // C++20
ranges::generate(globalArray, [&] { return dist(engine); });

【讨论】:

猜你喜欢
  • 2016-05-04
  • 2015-04-08
  • 1970-01-01
  • 2010-12-04
  • 2022-06-30
  • 2014-10-23
  • 2022-07-14
相关资源
最近更新 更多