Random plot algorithm

2020-01-24 13:59发布

I have two dimensional array. I want to pick a slot at random, and continue to do so never picking the same slot twice until I have finally picked all slots (so nothing random about the last pick of course). Is there a well known algorithm for doing this? I'm using C#, but obviously this is more about algorithms than any particular platform. Yes, 'the big book' is on my purchase list :)

标签: c# .net random
4条回答
爱情/是我丢掉的垃圾
2楼-- · 2020-01-24 14:24

Take a look at the Fisher-Yates shuffle. It's designed to pick a random permutation from a set.

查看更多
甜甜的少女心
3楼-- · 2020-01-24 14:31

Assuming your array is like this:

Random rand = new Random();

object[,] array = new object[width,height];
bool[,] chosen = new bool[width,height];

int i, j;
do
{
    i = rand.Next(width);
    j = rand.Next(height);
} while (chosen[i,j]);

chosen[i,j] = true;
object current = array[i,j];

This should work fine.

查看更多
唯我独甜
4楼-- · 2020-01-24 14:39

I did this for numbers

list<int> PastList=new PastList<int>();
private void Choоse()
{
   int i = Recurs();
   PastList.Add(i);
}

private int Recurs()
{
   int i;

   i = rnd.Next(0, 99);
   if (PastList.Contains(i))
   {
       i = Recurs();
   }

   return i;
}
查看更多
三岁会撩人
5楼-- · 2020-01-24 14:45

Using the Fisher-Yates shuffle algorithm as mentioned before (in O(n) time)

int X = 3;  int Y = 4;
int[] array = new int[X * Y];

for (int i = 0; i < array.Length; i++) array[i] = i;
FisherYatesShuffle(array);

var randomSlots = array.Select((i,j) => new {x=array[j]%X , y=array[j]/X })
                       .ToArray();

public static void FisherYatesShuffle<T>(T[] array)
{
    Random r = new Random();
    for (int i = array.Length - 1; i > 0; i--)
    {
        int j = r.Next(0, i + 1);
        T temp = array[j];
        array[j] = array[i];
        array[i] = temp;
    }
}
查看更多
登录 后发表回答