🎲

[Unreal Engine 5] メルセンヌ・ツイスタで乱数を生成する

2025/01/15に公開


結論

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.hrand() に行き着く。
rand() の実装は処理系依存だが、MSのリファレンス には、この関数の性能は高くないと書いてある。
また、性能の良い乱数が欲しければ <random> ヘッダを使え、と言っている。

Dynamic Mesh については 座標から mesh を生成する を参照。

参考にしたページ

Discussion