개발 관련/SW, App 관련

겹치지 않는 난수 뽑기

소서리스25 2023. 4. 24. 12:07
반응형

겹치지 않는 난수 뽑기

 

개발을 하다보면 가끔 겹치지 않는 난수가 필요한 상황이 발생한다.

여러가지 방법?이 있겠지만...

현재 사용하고 있는 방법은 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static T[] ShuffleArray<T>(T[] array, int seed)
{        
    System.Random prng = new System.Random (seed);
 
    for (int i = 0; i < array.Length-1; i++
    {
        int randomIndex = prng.Next (i, array.Length);
 
        T tempItem = array [randomIndex];
        array [randomIndex] = array [i];
        array [i] = tempItem;
    }
 
    return array;
}
cs

 

결과는 seed 값에 따라 등록된 숫자나 문자를 겹치지 않게 잘 섞어준다.

아래와 같은 섞은 데이터를 확인 할 수 있다.

숫자 또는 문자를 잘 섞어준다
숫자 또는 문자를 겹치지 않게 잘 섞어준다

 

위의 결과를 얻는 전체 코드는 다음과 같으며 좀더 쉽게 결과를 확인 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class ShuffleData : MonoBehaviour
{
 
    string[] rndChar = {"A""B""C""D""E""F""G" };
    int[] rndNum = { 1234567 };
 
    void Start()
    {
        foreach(var x in ShuffleArray(rndNum, 1))
        {
            print(x);
        }
    }
 
    public static T[] ShuffleArray<T>(T[] array, int seed)
    {
        System.Random prng = new System.Random(seed);
 
        for (int i = 0; i < array.Length - 1; i++)
        {
            int randomIndex = prng.Next(i, array.Length);
 
            T tempItem = array[randomIndex];
            array[randomIndex] = array[i];
            array[i] = tempItem;
        }
 
        return array;
    }
}
cs

 

예전에는 프로그램을 잘 모를때.. 지금도 그렇지만.. 아주 초보적인 방법을 썼었다.

if문으로 겹치지 않을때까지 반복했으니 그만큼 비효율적이었던 적이 있었다.

지금도 가끔 잘 모르니까 어떻게든 해결하고자 방법을 찾아보면 무식한 방법으로 밖에 할 수 없는 경우가 종종 생긴다.

 

반응형