728x90
반응형
728x170
■ IList<T> 인터페이스를 사용해 리스트를 임의로 섞는 방법을 보여준다.
▶ ThreadSafeRandom.cs
namespace TestProject;
/// <summary>
/// 쓰레드 안전 난수기
/// </summary>
public static class ThreadSafeRandom
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 난수기
/// </summary>
[ThreadStatic]
private static Random _random;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 난수 값 - RandomValue
/// <summary>
/// 난수 값
/// </summary>
public static Random RandomValue
{
get
{
return _random ?? (_random = new Random(unchecked(Environment.TickCount * 31 + Thread.CurrentThread.ManagedThreadId)));
}
}
#endregion
}
▶ ListExtension.cs
namespace TestProject;
/// <summary>
/// 리스트 확장
/// </summary>
public static class ListExtension
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 섞기 - Shuffle<TItem>(sourceList)
/// <summary>
/// 섞기
/// </summary>
/// <typeparam name="TItem">항목 타입</typeparam>
/// <param name="sourceList">소스 리스트</param>
public static void Shuffle<TItem>(this IList<TItem> sourceList)
{
int count = sourceList.Count;
while(count > 1)
{
count--;
int index = ThreadSafeRandom.RandomValue.Next(count + 1);
TItem value = sourceList[index];
sourceList[index] = sourceList[count];
sourceList[count] = value;
}
}
#endregion
}
▶ Program.cs
namespace TestProject;
/// <summary>
/// 프로그램
/// </summary>
class Program
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 프로그램 시작하기 - Main()
/// <summary>
/// 프로그램 시작하기
/// </summary>
private static void Main()
{
List<int> list = new List<int>(Enumerable.Range(1, 45));
Console.WriteLine("로또 추출 번호");
for(int i = 0; i < 5; i++)
{
list.Shuffle();
Console.WriteLine(" {0}", string.Join(", ", list.GetRange(0, 6)));
}
}
#endregion
}
728x90
반응형
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON/.NET6] object 클래스 : GetHashCode/Equals 메소드를 사용해 열거 가능형에서 중복 항목 제거하기 (0) | 2022.10.12 |
---|---|
[C#/COMMON/.NET6] IEqualityComparer<T> 인터페이스 : 열거 가능형에서 중복 항목 제거하기 (0) | 2022.10.12 |
[C#/COMMON/.NET6] IEnumerable<T> 인터페이스 : 열거 가능형 임의로 섞기 (0) | 2022.10.12 |
[C#/COMMON/.NET6] List<T> 클래스 : 리스트 임의로 섞기 (0) | 2022.10.12 |
[C#/COMMON/.NET6] IEnumerable<T> 인터페이스 : 열거 가능형 임의로 섞기 (0) | 2022.10.12 |
[C#/COMMON/.NET6] DataTable 클래스 : ImportRow 메소드를 사용해 DataRow 객체 가져오기 (0) | 2022.10.10 |
[C#/COMMON/.NET6] 가우스 정규 난수기 사용하기 (0) | 2022.10.09 |
[C#/COMMON/.NET6] 가우스 정규 난수기 사용하기 (0) | 2022.10.09 |
[C#/COMMON/.NET6] Normal 클래스 : Sample 메소드를 사용해기 가우스 정규 난수 생성하기 (0) | 2022.10.09 |
[C#/COMMON/.NET6] 누겟 설치 : MathNet.Numerics (0) | 2022.10.09 |
댓글을 달아 주세요