Смотря на перестановку четыре переменные (пытающийся изменить порядок они появляются в в списке разнообразного выбора).
Я вводил по абсолютному адресу вокруг некоторое время, но я не могу вполне получить голову вокруг логики, и поиск случайных перестановок в прошлых вопросах дает суперподробные алгоритмы, которые являются вне моих навыков новичка (и потребности этой программы, которую я пытаюсь записать, я был бы точно так же, как для создания альтернативного средства выбора изображения).
Идеально я хотел бы что-то, что следует этому псевдокоду:
// int Answer1 = Random(min1 max4)
// int Answer2 = Random(min1 max4)
// int Answer3 = Random(min1 max4)
// int Answer4 = Random(min1 max4)
// If Answer 1 equals ANY of the other three, re-randomize Answer1 and loop.
// Loop through this cycle for all answers.
Я отправил бы свой текущий обычный код, но откровенно говоря, это - мусор.:( Это походит на достаточно простую проблему, но я просто не могу разобраться в ней.
Заранее спасибо!
Random rand = new Random();
List<int> choices = new List<int>() { 1, 2, 3, 4 };
while (choices.Count > 0)
{
int index = rand.Next() % choices.Count;
int choice = choices[index];
Console.WriteLine(choice);
choices.RemoveAt(index);
}
редактирование - Вместо того, чтобы просто печатать числа, вы, очевидно, могли бы добавить их в новый список.
.Shuffling - http://www.codinghorror.com/blog/archives/001008.html
Хотя не используйте направляющую, используйте случайное число:
//create only once, please
static readonly Random random = new Random();
, а затем:
var numbers = Enumerable.Range(1, 4);
var shuffle = numbers.OrderBy(a => random.NextDouble());
Мне нравится этот метод расширения:
static class IListExtensions {
public static void Shuffle<T>(this IList<T> list, Random rg) {
for (int i = list.Count; i > 1; i--) {
int k = rg.Next(i);
T temp = list[k];
list[k] = list[i - 1];
list[i - 1] = temp;
}
}
}
Затем:
Random rg = new Random();
List<int> list = Enumerable.Range(1, 4).ToList();
list.Shuffle(rg);
Теперь list
представляет собой перетасовку {1, 2, 3, 4}
.
Алгоритм, который я использовал здесь, это Фишер-Йейтс перетасовка.
.Ну, технически, кого волнует, что это всего 4 числа из 400. Вы должны использовать реализацию Фишера-Йейтса shuffle. Однако, чтобы было легче понять:
var possibleNumbers = new List<int>(Enumerable.Range(1, 4));
var result = new List<int>(4);
var rnd = new Random();
while (possibleNumbers.Count > 0) {
int r = rnd.Next(possibleNumbers.Count);
result.Add(possibleNumbers[r]);
possibleNumbers.RemoveAt(r);
}
алгоритм, показанный выше, в основном является тасовкой Фишера-Йейтса. На практике, вы не используете два разных списка для хранения вещей. Вы просто выбираете случайный элемент из той части массива, которую еще не исправили, и перемещаете его на свое место. Началом одного списка будут фиксированные элементы, а концом - возможности.
.