Способ быстро переставить номера 1 - 4?

Смотря на перестановку четыре переменные (пытающийся изменить порядок они появляются в в списке разнообразного выбора).

Я вводил по абсолютному адресу вокруг некоторое время, но я не могу вполне получить голову вокруг логики, и поиск случайных перестановок в прошлых вопросах дает суперподробные алгоритмы, которые являются вне моих навыков новичка (и потребности этой программы, которую я пытаюсь записать, я был бы точно так же, как для создания альтернативного средства выбора изображения).

Идеально я хотел бы что-то, что следует этому псевдокоду:

// 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.

Я отправил бы свой текущий обычный код, но откровенно говоря, это - мусор.:( Это походит на достаточно простую проблему, но я просто не могу разобраться в ней.

Заранее спасибо!

5
задан user236494 6 January 2010 в 05:19
поделиться

4 ответа

        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);
        }

редактирование - Вместо того, чтобы просто печатать числа, вы, очевидно, могли бы добавить их в новый список.

.
0
ответ дан 18 December 2019 в 09:07
поделиться

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());
8
ответ дан 18 December 2019 в 09:07
поделиться

Мне нравится этот метод расширения:

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}.

Алгоритм, который я использовал здесь, это Фишер-Йейтс перетасовка.

.
5
ответ дан 18 December 2019 в 09:07
поделиться

Ну, технически, кого волнует, что это всего 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);
}

алгоритм, показанный выше, в основном является тасовкой Фишера-Йейтса. На практике, вы не используете два разных списка для хранения вещей. Вы просто выбираете случайный элемент из той части массива, которую еще не исправили, и перемещаете его на свое место. Началом одного списка будут фиксированные элементы, а концом - возможности.

.
5
ответ дан 18 December 2019 в 09:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: