Алгоритм генерации случайного порядка элементов

Сумма значения, Вы выходите из изучения API Win32, (кроме видов общего понимания Вы добираетесь от приобретения знаний о том, как основные детали машины совмещаются) зависит от того, чего Вы пытаетесь достигнуть. Много API Win32 было обернуто приятно в классах библиотеки.NET, но не всем этом. Если бы, например, Вы надеетесь делать некоторое серьезное аудио программирование, та часть API Win32 была бы превосходным предметом исследования, потому что только самые основные из операций доступны от классов.NET. В последний раз я проверил, что даже управляемая библиотека DirectX DirectSound была ужасна.

Рискуя бесстыдной саморекламой....

я просто столкнулся с ситуацией, где API Win32 был моей единственной опцией. Я хочу иметь различные подсказки на каждом объекте в поле списка. Я описал, как я сделал это на этот вопрос .

8
задан Jacob 6 November 2009 в 16:47
поделиться

4 ответа

22
ответ дан 3 November 2019 в 14:38
поделиться

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

В первом посте Я исследую некоторые возможности и, наконец, получаю «функцию для случайной перестановки общего списка со сложностью O (n)», правильно инкапсулированную для работы с неизменяемыми данными (т.е. без побочных эффектов).

Во втором случае сообщение, я делаю его равномерно распространенным.

Код на F #, надеюсь, вы не против!

Удачи.

РЕДАКТИРОВАТЬ: У меня нет формального доказательства, но интуиция говорит мне, что сложность такого алгоритма не может быть ниже O (n) . Я был бы очень признателен, если бы это было сделано быстрее!

2
ответ дан 3 November 2019 в 14:38
поделиться

Простой способ рандомизировать порядок - создать новый список правильного размера (20 в вашем случае), перебрать первый список и добавить каждый элемент в случайной позиции в второй список. Если случайная позиция уже заполнена, поместите ее в следующую свободную позицию.

Я думаю, что этот псевдокод правильный:

list newList
foreach (element in firstList)
    int position = Random.Int(0, firstList.Length - 1)
    while (newList[position] != null)
        position = (position + 1) % firstList.Length
    newList[position] = element

РЕДАКТИРОВАТЬ: поэтому оказывается, что этот ответ на самом деле не так хорош. Это не особенно быстро и не особенно случайно. Спасибо за ваши Коментарии. Чтобы получить хороший ответ, вернитесь к началу страницы: -)

1
ответ дан 3 November 2019 в 14:38
поделиться

Возможно, кто-то уже реализовал перетасовку для вас. Например, в Python вы можете использовать random.shuffle , в C ++ random_shuffle и в PHP shuffle .

1
ответ дан 3 November 2019 в 14:38
поделиться