【问题标题】:Generate random long long C++生成随机 long long C++
【发布时间】:2021-05-13 05:39:49
【问题描述】:

int生成器

我目前使用此代码生成确定性伪随机 ints:

#include <chrono>
#include <ctime>
#include <random>
#include <stdint.h>

const uint32_t CurrentTime = static_cast<uint32_t>(std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now().time_since_epoch()).count());

std::mt19937 Mersenne = std::mt19937(static_cast<std::mt19937::result_type>(CurrentTime));

int Min = 3;
int Max = 6;
std::uniform_int_distribution<> Distribution(Min, Max-1);

int Result = Distribution(Mersenne);

问题

这有两个问题:

  1. Distribution 的参数必须是ints。
  2. Distribution(Mersenne) 的结果是int

问题

如何生成随机的long long 而不是int,同时MinMax 参数也是long longs 而不是ints?

上下文

我正在创建一个确定性游戏(点对点架构),并且需要 long long 的较大最小大小作为一种定点数(因为 floats 可能导致非决定论)。

我不会接受以下答案:

  • 使用floats 或doubles
  • 建议生成int 并将其转换为long long
  • 以非确定性方式生成随机数(即,如果使用相同的种子,则 mersenne 是确定性的)

如果有标准库中的解决方案,我会更喜欢。

理想情况下,该解决方案至少应该与我在 64 位机器上的现有代码一样高效。

【问题讨论】:

  • std::uniform_int_distribution&lt;int64_t&gt; ?还是我错过了什么?
  • 查看构造函数en.cppreference.com/w/cpp/numeric/random/…的文档就知道了,它明确说它使用的成员类型可以是任何int类型。
  • @bolov 不应该是std::uniform_int_distribution&lt;long long&gt;吗?
  • 这个问题是有效的,我不明白否决票
  • 我获得代码的源没有为std::uniform_int_distribution&lt;&gt; 指定模板参数(即使是cppreference 上的示例代码也是如此)。我什至没有想过 &lt;&gt; 是干什么用的。

标签: c++ random c++17 mersenne-twister


【解决方案1】:

documentation 表示模板参数可以是long long

long long Min = 3;
long long Max = 6;
std::uniform_int_distribution<long long> Distribution(Min, Max-1);

long long Result = Distribution(Mersenne);

【讨论】:

    【解决方案2】:

    这对你有用吗?

    #include <climits>
    #include <random>
    #include <iostream>
    
    int main()
    {
        std::random_device rd;
        std::mt19937 gen(rd()); // Here you can use any seed to make it deterministic
        std::uniform_int_distribution<long long> distrib(LLONG_MIN, LLONG_MAX);
        
        for (int n = 0; n < 5; ++n)
            std::cout << distrib(gen) << ' ';
        
        std::cout << '\n';
    }
    

    【讨论】:

      猜你喜欢
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多