gpt4 book ai didi

c++ - thread-local static uniform_int_distribution,是否会针对不同的min、max集合重新创建?

转载 作者:行者123 更新时间:2023-11-30 03:53:32 28 4
gpt4 key购买 nike

this answer on stackoverflow (答案 #2)@remyabel 推荐这个模板:

#include <random>

std::mt19937& prng_engine()
{
thread_local static std::random_device rd{};
thread_local static std::mt19937 engine{rd()};

// Or you can replace the two previous lines with:
//thread_local static std::mt19937
// prng{std::random_device{}()};

return engine;
}

template<typename T>
T getRandomNumberBetween(T Min, T Max)
{
thread_local static std::uniform_int_distribution<T> dist{Min, Max};
return dist(prng_engine());
}

对于线程中给定的 {T, Min, Max} 集合,dist 是否只创建一次?

如果我用 (1, 10) 调用它,然后用 (11, 20) 调用它,它是否会被重新创建?

最佳答案

因为它是静态的,dist 只创建一次 - 第一次代码流经它。

代码第一次流过它时,Min 和 Max 的值将为 1 和 10。

在第二次调用时,dist 不会重新创建,因此 Min 和 Max 的新值将被忽略,您会得到一个介于 1 和 10 之间的随机数。

编辑:

这里有一个 getRandomNumberBetween 的实现,它可以做你想做的事:

template<typename T>
T getRandomNumberBetween(T Min, T Max)
{
using range_t = std::pair<T, T>;
using map_t = std::map<range_t, std::uniform_int_distribution<T>>;
static thread_local map_t range_map;

auto i = range_map.find(range_t(Min, Max));
if (i == std::end(range_map))
{
i = range_map.emplace(std::make_pair(Min, Max), std::uniform_int_distribution<T> { Min, Max}).first;
}
return i->second(prng_engine());
}

关于c++ - thread-local static uniform_int_distribution,是否会针对不同的min、max集合重新创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30096963/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com