У меня есть двумерный массив. Я хочу выбрать случайный случай и продолжать делать так, чтобы никогда не выбирать один и тот же слот дважды, пока я, наконец, не выбрал все слоты (так что ничего случайного о последнем выборе курса). Есть ли известный алгоритм для этого? Я использую C#, но, очевидно, это больше об алгоритмах, чем о любой конкретной платформе. Да, «большая книга» находится в моем списке покупок :)Случайный алгоритм построения
ответ
Использование алгоритма Fisher-Yates shuffle, как упоминалось ранее (в O (п))
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;
}
}
Посмотрите на . Он предназначен для выбора случайной перестановки из набора.
Если предположить, что массив выглядит так:
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];
Это должно работать нормально.
Спасибо, лучше, чем рекурсивное решение выше, но все же мы будем стремиться все больше и больше, поскольку мы доходите до конца набора. Возможно, это всего лишь неотвратимая проблема? –
@MylesMcDonnell Я не думаю, что это можно избежать, и ваше редактирование нарушило функциональность кода. он не должен быть '!', если выбрано значение true, этот индекс недействителен. Я вернул код обратно. –
Извините за беспорядок с ответом;) –
Я сделал это для чисел
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;
}
Проблема в том, что чем ближе мы добираемся до конца набора, тем больше рекурсии. Для получения последнего элемента может потребоваться много вызовов rnd.Next (0,99). Уч. –
- 1. Алгоритм построения диаграммы дерева
- 2. Алгоритм построения неравенства
- 3. Алгоритм построения дерева дерева
- 4. Каков алгоритм построения тральщика?
- 5. Алгоритм построения многоугольной сетки
- 6. Алгоритм плавного построения (Java2d)
- 7. Алгоритм построения схем (метро)
- 8. Гауссовский алгоритм построения кривой
- 9. Лучше случайный алгоритм?
- 10. Стабильный случайный алгоритм цвета
- 11. Случайный алгоритм списка воспроизведения
- 12. AS3 случайный алгоритм
- 13. Простой псевдо-случайный алгоритм
- 14. Алгоритм построения пирамиды с квадратами
- 15. простой алгоритм построения с автомасштабированием
- 16. Алгоритм построения моста в Java?
- 17. Как оптимизировать случайный алгоритм сортировки?
- 18. Случайный алгоритм с регулируемой вероятностью
- 19. Случайный алгоритм развития лесного дерева
- 20. Алгоритм построения графа из множества точек
- 21. Алгоритм построения графа, заданный бесконечным ходом
- 22. Алгоритм построения линии с толщиной/шириной
- 23. Алгоритм программирования схемы построения сети snmp
- 24. Алгоритм Дейкстры на пути построения Python
- 25. Алгоритм построения массива на основе Gomoku?
- 26. алгоритм извлечения для построения правил пролога
- 27. Алгоритм построения графика DeBruijn дает неправильные результаты
- 28. Алгоритм для построения всех возможных построек
- 29. Самый простой алгоритм построения Вороного для реализации?
- 30. Дейкстры Алгоритм Построения с SQL и PHP
Вы ищете [случайный перестановка] (http://stackoverflow.com/search?q=%5Bc%23%5D+random+permutation) набора слотов. – dtb
Возможный дубликат [Случайный алгоритм списка воспроизведения] (http://stackoverflow.com/questions/1816534/random-playlist-algorithm) – dtb