🎲
[Unreal Engine 5] メルセンヌ・ツイスタで乱数を生成する
結論
RandomNumberGenerator.h
#pragma once
#include "CoreMinimal.h"
#include <random>
class MYPROJECTCPP_API RandGen
{
public:
static std::mt19937_64& mt64();
static std::uint64_t rand();
static double uni_real(double min, double max);
};
RandomNumberGenerator.cpp
#include "RandomNumberGenerator.h"
std::mt19937_64& RandGen::mt64()
{
static std::mt19937_64 engine(std::random_device{}());
return engine;
}
std::uint64_t RandGen::rand()
{
return mt64()();
}
double RandGen::uni_real(double min, double max)
{
std::uniform_real_distribution<> dist(min, max);
return dist(mt64());
}
MyDynamicMeshActor.cpp
#include "MyDynamicMeshActor.h"
#include "DynamicMesh/DynamicMesh3.h"
#include "RandomNumberGenerator.h"
void AMyDynamicMeshActor::BeginPlay()
{
auto meshCmp = GetDynamicMeshComponent();
auto mesh = meshCmp->GetMesh();
const FVector3d vertex[] = { {0,0,RandGen::uni_real(0,1)},
{0,1,RandGen::uni_real(0,1)},
{1,0,RandGen::uni_real(0,1)},
{1,1,RandGen::uni_real(0,1)} };
double s = 200.0;
mesh->AppendVertex(vertex[0] * s);
mesh->AppendVertex(vertex[1] * s);
mesh->AppendVertex(vertex[2] * s);
mesh->AppendVertex(vertex[3] * s);
mesh->AppendTriangle(0, 1, 2);
mesh->AppendTriangle(3, 2, 1);
meshCmp->NotifyMeshUpdated();
meshCmp->EnableComplexAsSimpleCollision();
meshCmp->UpdateCollision();
}
補足
手っ取り早く乱数を使うには "Math/UnrealMathUtility.h"
を include して FMath::FRandRange( min , max )
を呼ぶ。
MyDynamicMeshActor.cpp
#include "MyDynamicMeshActor.h"
#include "Math/UnrealMathUtility.h"
#include "Kismet/KismetSystemLibrary.h"
void AMyDynamicMeshActor::BeginPlay()
{
auto a = FMath::FRandRange(0.0, 1.0);
UKismetSystemLibrary::PrintString(this, FString::SanitizeFloat(a));
}
このFRandRange()
の中の処理を辿っていくと stdlib.h
の rand()
に行き着く。
rand()
の実装は処理系依存だが、MSのリファレンス には、この関数の性能は高くないと書いてある。
また、性能の良い乱数が欲しければ <random>
ヘッダを使え、と言っている。
Dynamic Mesh については 座標から mesh を生成する を参照。
Discussion