微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

生成随机 long long C++

如何解决生成随机 long long C++

int 生成

我目前使用以下代码生成确定性伪随机 int

#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 的参数必须是 int
  2. distribution(Mersenne) 的结果是 int

问题

如何生成随机 long long 而不是 intMinMax 参数也是 long long 而不是 {{1 }}s?

背景

我正在创建一个确定性游戏(点对点架构),并且需要 int 的大的最小尺寸作为一种定点数(因为 long longs可能会导致不确定性)。

我不会接受以下答案:

  • 使用 floatfloat
  • 建议生成一个 double 并将其转换为 int
  • 非确定性地生成随机数(即,如果使用相同的种子,则梅森是确定性的)

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

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

解决方法

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);
,

这对你有用吗?

#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';
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。