UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
WeightedRandomSampler.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4WeightedRandomSampler.h:
5Helper class for randomly sampling from N entries with non uniform weighting/probability.
6Useful for constant data that is sampled many times / sampling is performance critical.
7
8Init time: O(n)
9Memory use: O(n)
10Sampling time: O(1)
11
12As discussed here:
13http://www.keithschwarz.com/darts-dice-coins/
14
15FWeightedRandomSampler is the base class which build the probability and alias tables.
16To use, inherit a class from this which implements the GetWeights() function.
17GetWeights() should return N positive floating point weights.
18Call initialize before sampling.
19To sample, call GetEntryIndex().
20GetEntryIndex takes two random floating values. This does not generate randoms for you as it's up to the user how to generate their randoms.
21=============================================================================*/
22
23#pragma once
24
25#include "CoreMinimal.h"
28
30{
32public:
35
39 inline int32 GetEntryIndex(float R0, float R1)const
40 {
41 int32 Idx = (int32)(R0 * float(Prob.Num()));
42 return R1 < Prob[Idx] ? Idx : Alias[Idx];
43 }
44
45 inline float GetTotalWeight()const { return TotalWeight; }
46
47 ENGINE_API virtual void Initialize();
48
49 ENGINE_API virtual void Serialize(FArchive& Ar);
50
51 int32 GetNumEntries() const { return Prob.Num(); }
52
53 TArrayView<const float> GetProb() const { return Prob; }
54 TArrayView<const int32> GetAlias() const { return Alias; }
55
56protected:
57
59 virtual float GetWeights(TArray<float>& OutWeights) = 0;
60
63 LAYOUT_FIELD(float, TotalWeight);
64};
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
Definition Archive.h:1208
Definition ArrayView.h:139
Definition Array.h:670
Definition WeightedRandomSampler.h:30
TArrayView< const float > GetProb() const
Definition WeightedRandomSampler.h:53
LAYOUT_FIELD(TMemoryImageArray< int32 >, Alias)
DECLARE_TYPE_LAYOUT(FWeightedRandomSampler, Abstract)
LAYOUT_FIELD(TMemoryImageArray< float >, Prob)
int32 GetNumEntries() const
Definition WeightedRandomSampler.h:51
virtual ENGINE_API void Initialize()
Definition WeightedRandomSampler.cpp:16
virtual float GetWeights(TArray< float > &OutWeights)=0
LAYOUT_FIELD(float, TotalWeight)
int32 GetEntryIndex(float R0, float R1) const
Definition WeightedRandomSampler.h:39
TArrayView< const int32 > GetAlias() const
Definition WeightedRandomSampler.h:54
virtual ENGINE_API ~FWeightedRandomSampler()
float GetTotalWeight() const
Definition WeightedRandomSampler.h:45
ENGINE_API FWeightedRandomSampler()
Definition WeightedRandomSampler.cpp:8