0 / 0 / 0
Регистрация: 20.03.2018
Сообщений: 19
|
|
1 | |
Массив: как сделать так, чтобы рандомно выбирались только те элементы массива, которые не были выбраны раньше?15.05.2018, 23:41. Показов 2122. Ответов 6
Метки нет Все метки)
(
В общем, из массива рандомно выбирается элемент, как сделать так, чтобы выбирались только те, которые не были выбраны раньше? Можно это сделать без дополнительного массива и чтобы памяти поменьше занимало? Уже должно было много раз обсуждаться, но видимо я не умею искать.
0
|
|
15.05.2018, 23:41 | |
Ответы с готовыми решениями:
6
Как сделать, чтобы слова выбирались рандомно, но не повторялись?
Как сделать, чтобы элементы динамического массива, которые равны 0, были размещены в конце массива? |
Модератор
9656 / 4976 / 3265
Регистрация: 17.08.2012
Сообщений: 15,476
|
|
16.05.2018, 01:38 | 2 |
Всё зависит от того, нужно ли Вам помнить первоначальное расположение элементов массива. Если нет - то не нужен дополнительный массив, достаточно "перемешать" массив, после чего читать из него элементы по порядку. Если да - то чудес не бывает, и нужно как-то запоминать, какие элементы были выбраны (либо, напротив, остались). И придётся использовать дополнительный массив (скорее всего - типа boolean), либо, если массив небольшой, использовать множество для хранения индексов выбранных (или оставшихся) элементов массива. В случае применения дополнительного массива типа boolean можно указать в начале программы директиву компилятора
Pascal {$BITPACKING ON} Pascal var ind: packed array[{здесь укажите размерность как у целевого массива}] of boolean;
1
|
0 / 0 / 0
Регистрация: 20.03.2018
Сообщений: 19
|
|
16.05.2018, 01:59 [ТС] | 3 |
Примерно так и думал, спасибо
![]() Добавлено через 7 минут Кстати, тогда ещё вопрос. Если массив довольно большой и нужно помнить изначальные индексы, то будет много времени занимать. Если при рандомном тыке каждый раз сверяться с дополнительным массивом, то при 100 на 100 шанс выбора последнего не выбранного элемента 1 к 10000, а это чёт долго будет. Можно как-нибудь оптимизировать?
0
|
![]() 2385 / 1297 / 1492
Регистрация: 29.08.2014
Сообщений: 4,661
|
|
16.05.2018, 10:32 | 4 |
0
|
0 / 0 / 0
Регистрация: 20.03.2018
Сообщений: 19
|
|
16.05.2018, 12:15 [ТС] | 5 |
Не сильно поможет наверное, та же ситуация будет, когда мало не выбранных останется. Но хотя да, можно что-то типа бинарного поиска сделать и проверять сначала всё слева, а потом справа если не найдётся.
0
|
Супер-модератор
![]() ![]() |
|
16.05.2018, 13:45 | 6 |
![]() Решение
Имеешь массив A[1 .. n], для него создаешь дополнительный массив индексов ix[1 .. n], перемешиваешь его любым нормальным алгоритмом, и потом просто идешь по нему по порядку либо с начала в конец, либо с конца в начало. Элемент a[ix[ i ]] будет "случайно" (насколько хорошо перемешаешь массив индексов - настолько более "случайно") выбран из массива A, но при этом, поскольку i все время только увеличивается/уменьшается, соответственно, ix[ i ] не повторяется - то и повторов из A не будет (если, конечно, в нем не было изначально одинаковых значений). Зато никаких затрат на получение следующего "случайного" элемента из A - просто inc(i)/dec(i), никаких проверок не надо.
Без доп. памяти это нереализуемо.
1
|
0 / 0 / 0
Регистрация: 20.03.2018
Сообщений: 19
|
|
16.05.2018, 18:13 [ТС] | 7 |
Нужно будет попробовать, спасибо
0
|
16.05.2018, 18:13 | |
Помогаю со студенческими работами здесь
7
Сделать так чтобы элементы массива вводил я, а не программа выдавала их рандомно Сделать так чтобы элементы массива вводил я, а не программа выдавала их рандомно Сделать так чтобы элементы массива вводил я, а не программа выдавала их рандомно
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |