1125

What is the best way to randomize the order of a generic list in C#? I've got a finite set of 75 numbers in a list I would like to assign a random order to, in order to draw them for a lottery type application.

4

32 Answers 32

1416

Shuffle any (I)List with an extension method based on the Fisher-Yates shuffle:

private static Random rng = new Random();  

public static void Shuffle<T>(this IList<T> list)  
{  
    int n = list.Count;  
    while (n > 1) {  
        n--;  
        int k = rng.Next(n + 1);  
        T value = list[k];  
        list[k] = list[n];  
        list[n] = value;  
    }  
}

Usage:

List<Product> products = GetProducts();
products.Shuffle();

The code above uses the much criticised System.Random method to select swap candidates. It's fast but not as random as it should be. If you need a better quality of randomness in your shuffles use the random number generator in System.Security.Cryptography like so:

using System.Security.Cryptography;
...
public static void Shuffle<T>(this IList<T> list)
{
    RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider();
    int n = list.Count;
    while (n > 1)
    {
        byte[] box = new byte[1];
        do provider.GetBytes(box);
        while (!(box[0] < n * (Byte.MaxValue / n)));
        int k = (box[0] % n);
        n--;
        T value = list[k];
        list[k] = list[n];
        list[n] = value;
    }
}

A simple comparison is available at this blog (WayBack Machine).

Edit: Since writing this answer a couple years back, many people have commented or written to me, to point out the big silly flaw in my comparison. They are of course right. There's nothing wrong with System.Random if it's used in the way it was intended. In my first example above, I instantiate the rng variable inside of the Shuffle method, which is asking for trouble if the method is going to be called repeatedly. Below is a fixed, full example based on a really useful comment received today from @weston here on SO.

Program.cs:

using System;
using System.Collections.Generic;
using System.Threading;

namespace SimpleLottery
{
  class Program
  {
    private static void Main(string[] args)
    {
      var numbers = new List<int>(Enumerable.Range(1, 75));
      numbers.Shuffle();
      Console.WriteLine("The winning numbers are: {0}", string.Join(",  ", numbers.GetRange(0, 5)));
    }
  }

  public static class ThreadSafeRandom
  {
      [ThreadStatic] private static Random Local;

      public static Random ThisThreadsRandom
      {
          get { return Local ?? (Local = new Random(unchecked(Environment.TickCount * 31 + Thread.CurrentThread.ManagedThreadId))); }
      }
  }

  static class MyExtensions
  {
    public static void Shuffle<T>(this IList<T> list)
    {
      int n = list.Count;
      while (n > 1)
      {
        n--;
        int k = ThreadSafeRandom.ThisThreadsRandom.Next(n + 1);
        T value = list[k];
        list[k] = list[n];
        list[n] = value;
      }
    }
  }
}
33
  • 37
    What if list.Count is > Byte.MaxValue? If n = 1000, then 255 / 1000 = 0, so the do loop will be an infinite loop since box[0] < 0 is always false.
    – AndrewS
    Jun 7, 2011 at 10:47
  • 19
    I would like to point out, that the comparison is flawed. Using <code>new Random()</code> in a loop is the problem, not the randomness of <code>Random</code> Explanation
    – Sven
    Sep 29, 2011 at 13:43
  • 9
    It is a good idea to pass an instance of Random to the Shuffle method rather than create it inside as if you are calling Shuffle lots of times in quick succession (e.g. shuffling lots of short lists), the lists will all be shuffled in the same way (e.g. first item always gets moved to position 3).
    – Mark Heath
    Feb 7, 2012 at 22:43
  • 8
    Just making Random rng = new Random(); a static would solve the problem in the comparison post. As each subsequent call would follow on from the previous calls last random result.
    – weston
    Nov 28, 2012 at 13:58
  • 6
    #2, it's not clear that the version with the Crypto generator works because the max range of a byte is 255, so any list larger than that will not shuffle correctly.
    – Mark Sowul
    May 8, 2013 at 14:37
535

If we only need to shuffle items in a completely random order (just to mix the items in a list), I prefer this simple yet effective code that orders items by guid...

var shuffledcards = cards.OrderBy(_ => Guid.NewGuid()).ToList();

As people have pointed out in the comments, GUIDs are not guaranteed to be random, so we should be using a real random number generator instead:

private static Random rng = new Random();
...
var shuffledcards = cards.OrderBy(_ => rng.Next()).ToList();
22
  • 51
    GUIDs are meant to be unique not random. Part of it is machine-based and another part time-based and only a small portion is random. blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx
    – Despertar
    May 5, 2013 at 7:00
  • 132
    This is a nice elegant solution. If you want something other than a guid to generate randomness, just order by something else. Eg: var shuffledcards = cards.OrderBy(a => rng.Next()); compilr.com/grenade/sandbox/Program.cs
    – grenade
    May 27, 2013 at 10:54
  • 30
    Please no. This is wrong. "ordering by random" is totally NOT a shuffle: you introduce a bias and, worse, you risk to go in infinite loops Aug 16, 2013 at 10:07
  • 97
    @VitoDeTullio: You are misremembering. You risk infinite loops when you provide a random comparison function; a comparison function is required to produce a consistent total order. A random key is fine. This suggestion is wrong because guids are not guaranteed to be random, not because the technique of sorting by a random key is wrong. Sep 13, 2013 at 21:30
  • 31
    @Doug: NewGuid only guarantees that it gives you a unique GUID. It makes no guarantees about randomness. If you're using a GUID for a purpose other than creating a unique value, you're doing it wrong. Sep 13, 2013 at 21:31
127

I'm bit surprised by all the clunky versions of this simple algorithm here. Fisher-Yates (or Knuth shuffle) is bit tricky but very compact. Why is it tricky? Because your need to pay attention to whether your random number generator r(a,b) returns value where b is inclusive or exclusive. I've also edited Wikipedia description so people don't blindly follow pseudocode there and create hard to detect bugs. For .Net, Random.Next(a,b) returns number exclusive of b so without further ado, here's how it can be implemented in C#/.Net:

public static void Shuffle<T>(this IList<T> list, Random rnd)
{
    for(var i=list.Count; i > 0; i--)
        list.Swap(0, rnd.Next(0, i));
}

public static void Swap<T>(this IList<T> list, int i, int j)
{
    var temp = list[i];
    list[i] = list[j];
    list[j] = temp;
}

Try this code.

4
  • 7
    This code does not work as expected. The last number is always 0 or list.Count-1.
    – Oneiros
    Jan 3, 2020 at 17:52
  • 3
    @ShitalShah The current code in your answer doesn't give correct results, because it's not a correct Fisher-Yates shuffle. It should be fixed, as well as the code in the link.
    – Trisibo
    Jul 13, 2020 at 18:37
  • 6
    This code is broken. If you used a list of strings for 3 letters, "A", "B", and "C", CBA, and BCA would literally never occur using this function, because of this line: list.Swap(0, rnd.Next(0, i)); switching it to the following fixes it and makes it a working, non-biased pseudo-random function: list.Swap(i-1, rnd.Next(0, i)); Aug 10, 2020 at 12:21
  • 6
    OP: "Fischer-Yates is a bit tricky." Proceeds to make one of the many common implementation mistakes.
    – D0SBoots
    Feb 13, 2022 at 6:10
84

Extension method for IEnumerable:

public static IEnumerable<T> Randomize<T>(this IEnumerable<T> source)
{
    Random rnd = new Random();
    return source.OrderBy<T, int>((item) => rnd.Next());
}
4
  • 13
    There are two significant problems with this algorithm: -- OrderBy uses a QuickSort variant to sort the items by their (ostensibly random) keys. QuickSort performance is O(N log N); in contrast, a Fisher-Yates shuffle is O(N). For a collection of 75 elements, this may not be a big deal, but the difference will become pronounced for larger collections.
    – John Beyer
    Jun 26, 2013 at 16:47
  • 13
    ... -- Random.Next() may produce a reasonably pseudo-random distribution of values, but it does not guarantee that the values will be unique. The probability of duplicate keys grows (non-linearly) with N until it reaches certainty when N reaches 2^32+1. The OrderBy QuickSort is a stable sort; thus, if multiple elements happen to get assigned the same pseudo-random index value, then their order in the output sequence will be the same as in the input sequence; thus, a bias is introduced into the "shuffle".
    – John Beyer
    Jun 26, 2013 at 17:06
  • 40
    @JohnBeyer: There are far, far greater problems than that source of bias. There are only four billion possible seeds to Random, which is far, far less than the number of possible shuffles of a moderately sized set. Only a tiny fraction of the possible shuffles can be generated. That bias dwarfs the bias due to accidental collisions. Sep 13, 2013 at 21:33
  • Another problem with Random is that, when two (or more) instances of Random get created shortly after one another, they might have the same seed (seed is taken from system clock and the clock resolution might be too big to register a change).
    – jahu
    May 14, 2021 at 10:16
20

Idea is get anonymous object with item and random order and then reorder items by this order and return value:

var result = items.Select(x => new { value = x, order = rnd.Next() })
            .OrderBy(x => x.order).Select(x => x.value).ToList()
1
  • 1
    What's the difference with directly ordering by rnd.Next() instead?
    – jeromej
    Nov 26, 2021 at 13:29
15
    public static List<T> Randomize<T>(List<T> list)
    {
        List<T> randomizedList = new List<T>();
        Random rnd = new Random();
        while (list.Count > 0)
        {
            int index = rnd.Next(0, list.Count); //pick a random item from the master list
            randomizedList.Add(list[index]); //place it at the end of the randomized list
            list.RemoveAt(index);
        }
        return randomizedList;
    }
0
10

EDIT The RemoveAt is a weakness in my previous version. This solution overcomes that.

public static IEnumerable<T> Shuffle<T>(
        this IEnumerable<T> source,
        Random generator = null)
{
    if (generator == null)
    {
        generator = new Random();
    }

    var elements = source.ToArray();
    for (var i = elements.Length - 1; i >= 0; i--)
    {
        var swapIndex = generator.Next(i + 1);
        yield return elements[swapIndex];
        elements[swapIndex] = elements[i];
    }
}

Note the optional Random generator, if the base framework implementation of Random is not thread-safe or cryptographically strong enough for your needs, you can inject your implementation into the operation.

A suitable implementation for a thread-safe cryptographically strong Random implementation can be found in this answer.


Here's an idea, extend IList in a (hopefully) efficient way.

public static IEnumerable<T> Shuffle<T>(this IList<T> list)
{
    var choices = Enumerable.Range(0, list.Count).ToList();
    var rng = new Random();
    for(int n = choices.Count; n > 1; n--)
    {
        int k = rng.Next(n);
        yield return list[choices[k]];
        choices.RemoveAt(k);
    }

    yield return list[choices[0]];
}

0
9

Starting in .NET 8, you can use Shuffle():

//Argument is Span<T> or T[]
Random.Shared.Shuffle(mySpan);

Or, for a cryptographically strong randomness:

//Argument is Span<T>
RandomNumberGenerator.Shuffle(mySpan);

For a list, you would have to create an array first (myList.ToArray()) shuffle as above and then create a new list from the shuffled array

1
  • 3
    Or you can do: var span = CollectionsMarshal.AsSpan(list); to avoid converting to array.
    – Magnus
    Aug 7, 2023 at 13:26
7

One can use the Shuffle extension methond from morelinq package, it works on IEnumerables

install-package morelinq

using MoreLinq;
...    
var randomized = list.Shuffle();
6

This is my preferred method of a shuffle when it's desirable to not modify the original. It's a variant of the Fisher–Yates "inside-out" algorithm that works on any enumerable sequence (the length of source does not need to be known from start).

public static IList<T> NextList<T>(this Random r, IEnumerable<T> source)
{
  var list = new List<T>();
  foreach (var item in source)
  {
    var i = r.Next(list.Count + 1);
    if (i == list.Count)
    {
      list.Add(item);
    }
    else
    {
      var temp = list[i];
      list[i] = item;
      list.Add(temp);
    }
  }
  return list;
}

This algorithm can also be implemented by allocating a range from 0 to length - 1 and randomly exhausting the indices by swapping the randomly chosen index with the last index until all indices have been chosen exactly once. This above code accomplishes the exact same thing but without the additional allocation. Which is pretty neat.

With regards to the Random class it's a general purpose number generator (and If I was running a lottery I'd consider using something different). It also relies on a time based seed value by default. A small alleviation of the problem is to seed the Random class with the RNGCryptoServiceProvider or you could use the RNGCryptoServiceProvider in a method similar to this (see below) to generate uniformly chosen random double floating point values but running a lottery pretty much requires understanding randomness and the nature of the randomness source.

var bytes = new byte[8];
_secureRng.GetBytes(bytes);
var v = BitConverter.ToUInt64(bytes, 0);
return (double)v / ((double)ulong.MaxValue + 1);

The point of generating a random double (between 0 and 1 exclusively) is to use to scale to an integer solution. If you need to pick something from a list based on a random double x that's always going to be 0 <= x && x < 1 is straight forward.

return list[(int)(x * list.Count)];

Enjoy!

6

If you don't mind using two Lists, then this is probably the easiest way to do it, but probably not the most efficient or unpredictable one:

List<int> xList = new List<int>() { 1, 2, 3, 4, 5 };
List<int> deck = new List<int>();

foreach (int xInt in xList)
    deck.Insert(random.Next(0, deck.Count + 1), xInt);
1
6

Just wanted to suggest a variant using an IComparer<T> and List.Sort():

public class RandomIntComparer : IComparer<int>
{
    private readonly Random _random = new Random();
    
    public int Compare(int x, int y)
    {
        return _random.Next(-1, 2);
    }
}

Usage:

list.Sort(new RandomIntComparer());
5

You can achieve that be using this simple extension method

public static class IEnumerableExtensions
{

    public static IEnumerable<t> Randomize<t>(this IEnumerable<t> target)
    {
        Random r = new Random();

        return target.OrderBy(x=>(r.Next()));
    }        
}

and you can use it by doing the following

// use this on any collection that implements IEnumerable!
// List, Array, HashSet, Collection, etc

List<string> myList = new List<string> { "hello", "random", "world", "foo", "bar", "bat", "baz" };

foreach (string s in myList.Randomize())
{
    Console.WriteLine(s);
}
0
4

We can use an extension method for List and use a thread-safe random generator combination. I've packaged an improved version of this on NuGet with the source code available on GitHub. The NuGet version contains optional cryptographically-strong random.

Pre-.NET 6.0 version:

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Shuffle<T>(this IList<T> list)
{
    if (list == null) throw new ArgumentNullException(nameof(list));
    int n = list.Count;
    while (n > 1)
    {
        int k = ThreadSafeRandom.Instance.Next(n--);
        (list[n], list[k]) = (list[k], list[n]);
    }
}

internal class ThreadSafeRandom
{
    public static Random Instance => _local.Value;

    private static readonly Random _global = new Random();
    private static readonly ThreadLocal<Random> _local = new ThreadLocal<Random>(() =>
    {
        int seed;
        lock (_global)
        {
            seed = _global.Next();
        }
        return new Random(seed);
    });
}

On .NET 6.0 or later:

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Shuffle<T>(this IList<T> list)
{
    ArgumentNullException.ThrowIfNull(list);
    int n = list.Count;
    while (n > 1)
    {
        int k = Random.Shared.Next(n--);
        (list[n], list[k]) = (list[k], list[n]);
    }
}

Install the library via NuGet for more features.

2
  • Is it normal for Shuffle to be void?
    – Dohab
    Jun 30, 2022 at 4:38
  • 1
    Yes, @Dohab. Use the NuGet package I linked above. Basically you just call myList.Shuffle(); and it's shuffled. There's also a .CryptoStrongShuffle(); Jun 30, 2022 at 8:07
3

If you have a fixed number (75), you could create an array with 75 elements, then enumerate your list, moving the elements to randomized positions in the array. You can generate the mapping of list number to array index using the Fisher-Yates shuffle.

0
3

I usually use:

var list = new List<T> ();
fillList (list);
var randomizedList = new List<T> ();
var rnd = new Random ();
while (list.Count != 0)
{
    var index = rnd.Next (0, list.Count);
    randomizedList.Add (list [index]);
    list.RemoveAt (index);
}
0
3

You can make the Fisher-Yates shuffle more terse and expressive by using tuples for the swap.

private static readonly Random random = new Random();

public static void Shuffle<T>(this IList<T> list)
{
    int n = list.Count;
    while (n > 1)
    {
        n--;
        int k = random.Next(n + 1);
        (list[k], list[n]) = (list[n], list[k]);
    }
}
2

Implementation:

public static class ListExtensions
{
    public static void Shuffle<T>(this IList<T> list, Random random)
    {
        for (var i = list.Count - 1; i > 0; i--)
        {
            int indexToSwap = random.Next(i + 1);
            (list[indexToSwap], list[i]) = (list[i], list[indexToSwap]);
        }
    }
}

Example:

var random = new Random();
var array = new [] { 1, 2, 3 };
array.Shuffle(random);
foreach (var item in array) {
    Console.WriteLine(item);
}

Demonstration in .NET Fiddle

1

A simple modification of the accepted answer that returns a new list instead of working in-place, and accepts the more general IEnumerable<T> as many other Linq methods do.

private static Random rng = new Random();

/// <summary>
/// Returns a new list where the elements are randomly shuffled.
/// Based on the Fisher-Yates shuffle, which has O(n) complexity.
/// </summary>
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> list) {
    var source = list.ToList();
    int n = source.Count;
    var shuffled = new List<T>(n);
    shuffled.AddRange(source);
    while (n > 1) {
        n--;
        int k = rng.Next(n + 1);
        T value = shuffled[k];
        shuffled[k] = shuffled[n];
        shuffled[n] = value;
    }
    return shuffled;
}
1
    List<T> OriginalList = new List<T>();
    List<T> TempList = new List<T>();
    Random random = new Random();
    int length = OriginalList.Count;
    int TempIndex = 0;

    while (length > 0) {
        TempIndex = random.Next(0, length);  // get random value between 0 and original length
        TempList.Add(OriginalList[TempIndex]); // add to temp list
        OriginalList.RemoveAt(TempIndex); // remove from original list
        length = OriginalList.Count;  // get new list <T> length.
    }

    OriginalList = new List<T>();
    OriginalList = TempList; // copy all items from temp list to original list.
0
1

Here is an implementation of the Fisher-Yates shuffle that allows specification of the number of elements to return; hence, it is not necessary to first sort the whole collection before taking your desired number of elements.

The sequence of swapping elements is reversed from default; and proceeds from the first element to the last element, so that retrieving a subset of the collection yields the same (partial) sequence as shuffling the whole collection:

collection.TakeRandom(5).SequenceEqual(collection.Shuffle().Take(5)); // true

This algorithm is based on Durstenfeld's (modern) version of the Fisher-Yates shuffle on Wikipedia.

public static IList<T> TakeRandom<T>(this IEnumerable<T> collection, int count, Random random) => shuffle(collection, count, random);
public static IList<T> Shuffle<T>(this IEnumerable<T> collection, Random random) => shuffle(collection, null, random);
private static IList<T> shuffle<T>(IEnumerable<T> collection, int? take, Random random)
{
    var a = collection.ToArray();
    var n = a.Length;
    if (take <= 0 || take > n) throw new ArgumentException("Invalid number of elements to return.");
    var end = take ?? n;
    for (int i = 0; i < end; i++)
    {
        var j = random.Next(i, n);
        (a[i], a[j]) = (a[j], a[i]);
    }

    if (take.HasValue) return new ArraySegment<T>(a, 0, take.Value);
    return a;
}
0

Here's an efficient Shuffler that returns a byte array of shuffled values. It never shuffles more than is needed. It can be restarted from where it previously left off. My actual implementation (not shown) is a MEF component that allows a user specified replacement shuffler.

    public byte[] Shuffle(byte[] array, int start, int count)
    {
        int n = array.Length - start;
        byte[] shuffled = new byte[count];
        for(int i = 0; i < count; i++, start++)
        {
            int k = UniformRandomGenerator.Next(n--) + start;
            shuffled[i] = array[k];
            array[k] = array[start];
            array[start] = shuffled[i];
        }
        return shuffled;
    }

`

0

I have found an interesting solution online.

Courtesy: https://improveandrepeat.com/2018/08/a-simple-way-to-shuffle-your-lists-in-c/

var shuffled = myList.OrderBy(x => Guid.NewGuid()).ToList();

1
0

Your question is how to randomize a list. This means:

  1. All unique combinations should be possible of happening
  2. All unique combinations should occur with the same distribution (AKA being non-biased).

A large number of the answers posted for this question do NOT satisfy the two requirements above for being "random".

Here's a compact, non-biased pseudo-random function following the Fisher-Yates shuffle method.

public static void Shuffle<T>(this IList<T> list, Random rnd)
{
    for (var i = list.Count-1; i > 0; i--)
    {
        var randomIndex = rnd.Next(i + 1); //maxValue (i + 1) is EXCLUSIVE
        list.Swap(i, randomIndex); 
    }
}

public static void Swap<T>(this IList<T> list, int indexA, int indexB)
{
   var temp = list[indexA];
   list[indexA] = list[indexB];
   list[indexB] = temp;
}
0
0

Beginning with .net 8.0 (nov. 2023) The new Random.Shuffle and RandomNumberGenerator.Shuffle<T>(Span<T>) methods let you randomize the order of a span of items.

int[] myNumbers = LoadNumbers();
Random.Shared.Shuffle(myNumbers);
// myNumbers are now shuffled.
0

With C#12, the proposed Fisher-Yates shuffle can be made a bit more concise, removing the need for a temporary variable:

public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random random)
{
    var r = new List<T>(source);
    var a = source.Count();

    while (a > 1)
    {
        var b = random.Next(a--);
        (r[b], r[a]) = (r[a], r[b]);
    }

    return r;
}

Also note that per convention, Enumerable extensions should return a new collection instead of modifying the source collection in-place.

-1

Here's a thread-safe way to do this:

public static class EnumerableExtension
{
    private static Random globalRng = new Random();

    [ThreadStatic]
    private static Random _rng;

    private static Random rng 
    {
        get
        {
            if (_rng == null)
            {
                int seed;
                lock (globalRng)
                {
                    seed = globalRng.Next();
                }
                _rng = new Random(seed);
             }
             return _rng;
         }
    }

    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> items)
    {
        return items.OrderBy (i => rng.Next());
    }
}
-1
 public Deck(IEnumerable<Card> initialCards) 
    {
    cards = new List<Card>(initialCards);
    public void Shuffle() 
     }
    {
        List<Card> NewCards = new List<Card>();
        while (cards.Count > 0) 
        {
            int CardToMove = random.Next(cards.Count);
            NewCards.Add(cards[CardToMove]);
            cards.RemoveAt(CardToMove);
        }
        cards = NewCards;
    }

public IEnumerable<string> GetCardNames() 

{
    string[] CardNames = new string[cards.Count];
    for (int i = 0; i < cards.Count; i++)
    CardNames[i] = cards[i].Name;
    return CardNames;
}

Deck deck1;
Deck deck2;
Random random = new Random();

public Form1() 
{

InitializeComponent();
ResetDeck(1);
ResetDeck(2);
RedrawDeck(1);
 RedrawDeck(2);

}



 private void ResetDeck(int deckNumber) 
    {
    if (deckNumber == 1) 
{
      int numberOfCards = random.Next(1, 11);
      deck1 = new Deck(new Card[] { });
      for (int i = 0; i < numberOfCards; i++)
           deck1.Add(new Card((Suits)random.Next(4),(Values)random.Next(1, 14)));
       deck1.Sort();
}


   else
    deck2 = new Deck();
 }

private void reset1_Click(object sender, EventArgs e) {
ResetDeck(1);
RedrawDeck(1);

}

private void shuffle1_Click(object sender, EventArgs e) 
{
    deck1.Shuffle();
    RedrawDeck(1);

}

private void moveToDeck1_Click(object sender, EventArgs e) 
{

    if (listBox2.SelectedIndex >= 0)
    if (deck2.Count > 0) {
    deck1.Add(deck2.Deal(listBox2.SelectedIndex));

}

    RedrawDeck(1);
    RedrawDeck(2);

}
0
-1

public List shufflelist(List list) { LetterClass tempelement; List templist = new List(); List listcopy = new List(); int rand;

    foreach (LetterClass item in list)
    {
        listcopy.Add(item);
    }

    while (listcopy.Count != 0)
    {
        rand = Random.Range(0, listcopy.Count);
        tempelement = listcopy[rand];
        templist.Add(listcopy[rand]);
        listcopy.Remove(tempelement);

    }

    return templist;

}
2
  • Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.
    – Community Bot
    Mar 29, 2023 at 6:01
  • To be a strictly valid answer, this block needs to operate generically on List<T>. From the first glance, it suffices to replace all entries of type List for it. Also, it makes sense to fix code block formatting and make a brief description of algorithm before the block.
    – P. Frolov
    Mar 30, 2023 at 12:38
-2
private List<GameObject> ShuffleList(List<GameObject> ActualList) {


    List<GameObject> newList = ActualList;
    List<GameObject> outList = new List<GameObject>();

    int count = newList.Count;

    while (newList.Count > 0) {

        int rando = Random.Range(0, newList.Count);

        outList.Add(newList[rando]);

        newList.RemoveAt(rando);

     

    }

    return (outList);

}

usage :

List<GameObject> GetShuffle = ShuffleList(ActualList);
0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.