随机绘图algorithm
我有二维数组。 我想随机select一个插槽,并继续这样做,从来没有select相同的插槽两次,直到我终于select所有插槽(所以没有任何关于最后一个select的随机)。 有这样一个众所周知的algorithm吗? 我正在使用C#,但显然这比任何特定的平台更关心algorithm。 是的,“大书”在我的购买清单:)
使用前面提到的Fisher-Yates shufflealgorithm(在O(n)时间)
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; } }
看看Fisher-Yates洗牌 。 它旨在从一个集合中随机select一个排列。
假设你的数组是这样的:
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];
这应该工作得很好。
我为数字做了这个
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; }