【发布时间】: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);
问题
这有两个问题:
-
Distribution的参数必须是ints。 -
Distribution(Mersenne)的结果是int。
问题
如何生成随机的long long 而不是int,同时Min 和Max 参数也是long longs 而不是ints?
上下文
我正在创建一个确定性游戏(点对点架构),并且需要 long long 的较大最小大小作为一种定点数(因为 floats 可能导致非决定论)。
我不会接受以下答案:
- 使用
floats 或doubles - 建议生成
int并将其转换为long long - 以非确定性方式生成随机数(即,如果使用相同的种子,则 mersenne 是确定性的)
如果有标准库中的解决方案,我会更喜欢。
理想情况下,该解决方案至少应该与我在 64 位机器上的现有代码一样高效。
【问题讨论】:
-
std::uniform_int_distribution<int64_t>?还是我错过了什么? -
查看构造函数en.cppreference.com/w/cpp/numeric/random/…的文档就知道了,它明确说它使用的成员类型可以是任何int类型。
-
@bolov 不应该是
std::uniform_int_distribution<long long>吗? -
这个问题是有效的,我不明白否决票
-
我获得代码的源没有为
std::uniform_int_distribution<>指定模板参数(即使是cppreference 上的示例代码也是如此)。我什至没有想过<>是干什么用的。
标签: c++ random c++17 mersenne-twister