본문 바로가기
프로그래밍/C#

가중치에 따른 랜덤 값 뽑기

by 뽀도 2024. 11. 15.

 

 

 

가중치에 따른 랜덤 값 뽑기 🎲


게임 서버나 애플리케이션 개발 시, 특정 항목을 랜덤하게 선택해야 할 경우가 종종 있다.
그럴때 각 항목에 가중치를 부여해서 확률적으로 선택되는 방법이 매우 유용하다.
 
예를 들면 항목 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

댓글