[英]C++ random uniform_int_distribution return same values in all threads
[英]C++ Return (uniform_int_distribution) from a function
我創建了這個隨機類,這樣我就可以在需要時在游戲引擎中使用隨機數,但是我遇到了函數問題,我想如何返回 R ? (請記住,我一般不熟悉編碼)
#pragma once
#include <ctime>
#include <random>
using namespace std;
class Random
{
private:
public:
Random() { default_random_engine RandomNumber(time(0));};
int RandomNumber()
{
uniform_int_distribution<int> R();
return = R;
}
float RandomFloat()
{
uniform_int_distribution<float> R();
}
int RandomNumberRange(int Min =0,int Max =0)
{
uniform_int_distribution<int> R(Min,Max);
}
float RandomFloatRange(float Min = 0, float Max = 0)
{
uniform_int_distribution<float> R(Min,Max);
}};
隨機數引擎應該被重用,但目前你將它聲明為一個局部變量,當構造函數退出時它永遠不會被再次使用和銷毀。 相反,讓default_random_engine
成為您的類的成員。
然后,要從分布中獲取實際的隨機數,您需要通過其重載的調用運算符調用它並將其傳遞給隨機數引擎:
class Random
{
private:
default_random_engine RandomNumber{time(0)};
public:
int RandomNumberRange(int Min =0,int Max =0)
{
return uniform_int_distribution<int>{Min,Max}(RandomNumber);
}
//...
};
真的沒有任何理由退回發行版本身。 所以我以一種可能更有意義的方式解釋了你的問題。
另請注意,使用time(0)
進行播種可能很糟糕。 但這本身就是一個巨大的話題。 特別是,如果您碰巧在短時間內連續創建Random
類的多個實例,則它們將被同等播種。 反而
default_random_engine RandomNumber{std::random_device{}()};
可能工作得更好。 它可能會使用系統提供的隨機數。 (但它可能不會,例如舊版本的 MinGW 確實以這種方式生成了確定性結果。)
int RandomNumber()
{
uniform_int_distribution<int> R();
return = R;
}
返回類型與上述函數中R
的類型不同。 R
是類型uniform_int_distribution<int>
而返回類型只是int
。 要返回R()
你必須改變函數的返回類型。
uniform_int_distribution<int> RandomNumber()
{
uniform_int_distribution<int> R;
return R;
}
請注意,它不是return = R
。 return
是一個關鍵字,而不是一個可以賦值的變量。 要返回一個變量只需使用return R;
.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.