使用C++ 11的<random>标准函数/类/等如何在以下范围内生成随机数:

  • (n,m)-不包括两端
  • (n,m]-不包括开始的
  • [n,m)-不包括结尾

  • 以及它们的特殊情况:
  • [0,n)
  • [0,1)

  • 还是可能有针对<random>的文档如备忘单?

    最佳答案

    Uniform Real Distribution

    uniform_real_distribution 将给出[a, b)范围内的值。我们可以使用 std::nextafter 在打开范围和关闭范围之间进行转换。

    int main() {
        std::random_device rd;
        std::mt19937 mt(rd());
    
        // [1, 10]
        std::uniform_real_distribution<> dist_a(1, std::nextafter(10, std::numeric_limits<double>::max));
    
        // [1, 10)
        std::uniform_real_distribution<> dist_b(1, 10);
    
        // (1, 10)
        std::uniform_real_distribution<> dist_c(std::nextafter(1, std::numeric_limits<double>::max), 10);
    
        // (1, 10]
        std::uniform_real_distribution<> dist_d(std::nextafter(1, std::numeric_limits<double>::max), std::nextafter(10, std::numeric_limits<double>::max));
    
        // Random Number Generators are used like this:
        for (int i=0; i<16; ++i)
            std::cout << dist_d(mt) << "\n";
    }
    

    Uniform Int Distribution

    uniform_int_distribution 将给出[a, b]范围内的值。我们可以添加和减去1在打开和关闭范围之间切换。
    int main() {
        std::random_device rd;
        std::mt19937 mt(rd());
    
        // [1, 10]
        std::uniform_int_distribution<> dist_a(1, 10);
    
        // [1, 10)
        std::uniform_int_distribution<> dist_b(1, 10 - 1);
    
        // (1, 10)
        std::uniform_int_distribution<> dist_c(1 + 1, 10 - 1);
    
        // (1, 10]
        std::uniform_int_distribution<> dist_d(1 + 1, 10);
    
        // Random Number Generators are used like this:
        for (int i=0; i<16; ++i)
            std::cout << dist_d(mt) << "\n";
    }
    

    关于c++ - 在[0,n)中生成随机数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30103792/

    10-11 16:40