Нужна повторяющаяся случайная выборка массива с помощью ключа - PullRequest
0 голосов
/ 20 февраля 2010

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

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

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

Я должен быть в состоянии определить, в каком порядке

Вот пример кода на csharp из:

public static TList<VoteSetupAnswer> ShuffleListWithKey(TList<VoteSetupAnswer> UnsortedList, int ShuffleKey)
    {
        TList<VoteSetupAnswer> SortedList = new TList<VoteSetupAnswer>();
        int UnsortedListCount = UnsortedList.Count;
        for (int i = 0; i < UnsortedListCount; i++)
        {
            int Location;
            SortedList.Add(OneArrayCycle(UnsortedList, ShuffleKey, out Location));
            UnsortedList.RemoveAt(Location);
        }
        return SortedList;
    }

    public static VoteSetupAnswer OneArrayCycle(TList<VoteSetupAnswer> array, int ShuffleKey, out int Location)
    {
        Location = 0;
        if (ShuffleKey == 1)
        {
            Location = 0;
            return array[0];
        }
        else
        {
            for (int x = 0; x <= ShuffleKey; x++)
            {
                if (x == ShuffleKey)
                    return array[Location];
                Location++;
                if (Location == array.Count)
                    Location = 0;
            }
            return array[Location];
        }
    }

Ответы [ 2 ]

1 голос
/ 20 февраля 2010

Произведите случайную перестановку, засуньте ГСЧ своим ключом.

 /**
     * Randomly permutes the array of this permutation. All permutations occur with approximately equal
     * likelihood. This implementation traverses the permutation array forward, from the first element up to
     * the second last, repeatedly swapping a randomly selected element into the "current position". Elements
     * are randomly selected from the portion of the permutation array that runs from the current position to
     * the last element, inclusive.
     * <p>
     * This method runs in linear time.
     */
    public static void shuffle(Random random, int[] a) {
        for (int i = 0; i < a.length - 1; i++) {
            swap(a, i, i + random.nextInt(a.length - i));
        }
    }
0 голосов
/ 20 февраля 2010

Реализуйте что-то вроде Фишера-Йейтса . Не катай свои собственные. Это может быть неправильно. Заполнить конструктор Random указанным значением. Перестановка будет повторяться.

В качестве альтернативы, это можно сделать с помощью linq:

var key=0;
var r=new Random(key);
myList.OrderBy(x=>r.Next());

Измените значение key, чтобы изменить случайный порядок.

...