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

C# list 랜덤(random) 하게 섞기

by bantomak 2024. 3. 21.
반응형

C#에서 Linq로 랜덤 하게 섞기

list의 요소들을 랜덤 하게 섞고 싶을 때 Linq OrderBy()에서 random 객체의 Next()를 호출하면 간단하게 해당 요소들을 섞을 수 있다.

 

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var list = new List<int>() { 1, 2, 3, 4, 5 };
        var random = new Random();

        var randomized = list.OrderBy(x => random.Next());
        foreach (var i in randomized)
        {
            Console.WriteLine(i);
        }
    }
}

 

 

객체들도 랜덤하게 섞는 것이 가능하다.

using System;
using System.Collections.Generic;
using System.Linq;

namespace shuffle_list 
{
  public class Person 
  {
     string name;
     public Person(string name) 
     {
        Name = name;
     }
    
     public string Name 
     {
        get => name;
        set => name = value;
     }
  }
  
  class Program 
  {
     static void Main(string[] args) 
     {
        List<Person> list1 = new List<Person>();

        list1.Add(new Person("Person 1"));
        list1.Add(new Person("Person 2"));
        list1.Add(new Person("Person 3"));
        list1.Add(new Person("Person 4"));
        list1.Add(new Person("Person 5"));

        var rnd = new Random();
        var randomized = list1.OrderBy(item => rnd.Next());

        foreach (var value in randomized) 
        {
           Console.WriteLine(value.Name);
        }
     }
  }
}

 

Fisher-Yates Shuffle 알고리즘을 사용하여 목록 섞기

Fisher-Yates 셔플 알고리즘은 C#에서 유한 데이터 구조를 셔플한다. 목록의 각 요소를 목록 내의 임의 색인에 순차적으로 저장한다. 아래의 예를 살펴보자.

 

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        var list = new List<int>() { 1, 2, 3, 4, 5 };

        list.Shuffle();
        foreach (var i in list)
        {
            Console.WriteLine(i);
        }
    }
}

public static class Extension
{
    private static Random random = new Random();

    public static void Shuffle<T>(this IList<T> values)
    {
        for (int i = values.Count - 1; i > 0; i--)
        {
            int k = random.Next(i + 1);
            T value = values[k];
            values[k] = values[i];
            values[i] = value;
        }
    }
}

 

무작위로 요소들이 섞였다.

 

함께 읽으면 좋은 글

 

C# 확장 메서드(Extension Method)

메서드 첫 번째 인자로 this가 보여서 당황스러울 때 이는 C#이 제공하는 확장 메서드로 이름 그대로 추가적인 메서드를 추가할 수 있습니다. 클래스, 자료구조, 인터페이스에 수정(modifying)이나

jettstream.tistory.com

참고 사이트

 

C#에서 목록 섞기

불행히도 C#에서 목록을 섞는 데 사용할 수있는 미리 정의 된 메서드가 없습니다. 따라서 C#에서 목록을 섞기 위해 자체 생성 된 코드에 의존해야합니다.

www.delftstack.com

댓글