가중치에 따른 랜덤 값 뽑기 🎲
게임 서버나 애플리케이션 개발 시, 특정 항목을 랜덤하게 선택해야 할 경우가 종종 있다.
그럴때 각 항목에 가중치를 부여해서 확률적으로 선택되는 방법이 매우 유용하다.
예를 들면 항목 A가 45%, B가 35%, C가 15%, D가 5%로선택되게 하는 방법이다.
이 포스트에서는 C# Random.Shared를 사용하여 어떻게 가중치 기반 랜덤 값을 뽑는지 설명하려 한다. 🎯
일단 가중치란 무엇을까? 🤔
**가중치(Weight)**는 각 항목이 선택될 확률을 상대적으로 조정하는 수치이다.
예를 들어, A 항목이 45%, B 항목이 35%, C 항목이 15%, D 항목이 5%의 가중치를 가지고 있다면,
A가 선택될 확률이 가장 높고, D는 상대적으로 가장 낮다.
가중치는 확률을 설정하는 것과 같으며, 높은 가중치를 가진 항목이 더 자주 선택되도록 한다. 🤩
C# 코드로 구현해보자 🔧
var weights = new[] { ("a", 45), ("b", 35), ("c", 15), ("d", 5) };
// 가중치의 합
int totalWeight = 0;
foreach (var weight in weights)
{
totalWeight += weight.Item2;
}
// 카운트 초기화
int countA = 0, countB = 0, countC = 0, countD = 0;
// 100번 돌려서 각 항목 선택 횟수 기록
for (int i = 0; i < 100; i++)
{
// 1부터 totalWeight까지의 난수 생성
int randomValue = Random.Shared.Next(1, totalWeight + 1);
int cumulativeWeight = 0;
// 선택된 가중치에 따라 항목 결정
foreach (var weight in weights)
{
cumulativeWeight += weight.Item2;
if (randomValue <= cumulativeWeight)
{
if (weight.Item1 == "a") countA++;
else if (weight.Item1 == "b") countB++;
else if (weight.Item1 == "c") countC++;
else if (weight.Item1 == "d") countD++;
break;
}
}
}
// 결과 출력
Console.WriteLine($"a: {countA}, b: {countB}, c: {countC}, d: {countD} = sum : {countA+countB+countC+countD } " );
총 100번을 수행했고 결과는 아래와 같다.
▶TEST 1 - 결과
a: 43, b: 39, c: 14, d: 4 = sum : 100
▶ TEST 2 - 결과
* a: 45, b: 30, c: 22, d: 3 = sum : 100
완벽하게 설정한 값은 아니더라도 비슷한 숫자의 추이를 보이고 있다.
반응형
'프로그래밍 > C#' 카테고리의 다른 글
Incremental Source Generator (0) | 2024.08.07 |
---|---|
MemoryPack 라이브러리 (0) | 2024.08.07 |
[C#] Global Using (0) | 2024.08.05 |
오버헤드 (0) | 2024.07.31 |
비동기에서[async/await] lock 사용하기 (0) | 2024.07.11 |
댓글