EnumerableExtensions.cs
using System.Collections.Generic;
using System;
using System.Linq;

namespace Facepunch.BombRoyale;

public static class EnumerableExtensions
{
	public static IEnumerable<T> Shuffle<T>( this IEnumerable<T> source )
	{
		return source.Shuffle( new Random() );
	}

	public static IEnumerable<T> Shuffle<T>( this IEnumerable<T> source, Random rng )
	{
		if ( source == null ) throw new ArgumentNullException( nameof( source ) );
		if ( rng == null ) throw new ArgumentNullException( nameof( rng ) );

		return source.ShuffleIterator( rng );
	}

	private static IEnumerable<T> ShuffleIterator<T>( this IEnumerable<T> source, Random rng )
	{
		var buffer = source.ToList();
		for ( int i = 0; i < buffer.Count; i++ )
		{
			int j = rng.Next( i, buffer.Count );
			yield return buffer[j];

			buffer[j] = buffer[i];
		}
	}
}