Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 20.03.2018
Сообщений: 19
1

Массив: как сделать так, чтобы рандомно выбирались только те элементы массива, которые не были выбраны раньше?

15.05.2018, 23:41. Просмотров 1311. Ответов 6
Метки нет (Все метки)

В общем, из массива рандомно выбирается элемент, как сделать так, чтобы выбирались только те, которые не были выбраны раньше? Можно это сделать без дополнительного массива и чтобы памяти поменьше занимало? Уже должно было много раз обсуждаться, но видимо я не умею искать.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2018, 23:41
Ответы с готовыми решениями:

Заполнить одномерный массив так, чтобы все его элементы были различны и выбраны случайным образом
В Delphi создать консольные приложения (File-New-Console Application) для решения следующих задач....

Как сделать, чтобы слова выбирались рандомно, но не повторялись?
Как сделать так что бы слова выбирались рандомно, но не повторялись? Какие замечания к...

Как сделать так чтобы выводились только те элементы, которые встречаются только 2 раза?
Как сделать так чтобы выводились только те элементы, которые встречаются только 2 раза? ...

Как сделать, чтобы элементы динамического массива, которые равны 0, были размещены в конце массива?
Нужно упорядочить массив по возрастанию и сделать, чтобы элементы, которые равны 0, были в конце....

6
Модератор
7651 / 3907 / 2760
Регистрация: 17.08.2012
Сообщений: 12,476
16.05.2018, 01:38 2
Всё зависит от того, нужно ли Вам помнить первоначальное расположение элементов массива. Если нет - то не нужен дополнительный массив, достаточно "перемешать" массив, после чего читать из него элементы по порядку. Если да - то чудес не бывает, и нужно как-то запоминать, какие элементы были выбраны (либо, напротив, остались). И придётся использовать дополнительный массив (скорее всего - типа boolean), либо, если массив небольшой, использовать множество для хранения индексов выбранных (или оставшихся) элементов массива. В случае применения дополнительного массива типа boolean можно указать в начале программы директиву компилятора
Pascal
{$BITPACKING ON}
и объявить массив как упакованный
Pascal
var
  ind: packed array[{здесь укажите размерность как у целевого массива}] of boolean;
В этом случае под тип boolean будет отводиться по одному биту памяти (а не по одному байту), и размер массива сократится в восемь раз, однако, доступ к элементам массива будет несколько медленнее.
1
0 / 0 / 0
Регистрация: 20.03.2018
Сообщений: 19
16.05.2018, 01:59  [ТС] 3
Примерно так и думал, спасибо

Добавлено через 7 минут
Кстати, тогда ещё вопрос. Если массив довольно большой и нужно помнить изначальные индексы, то будет много времени занимать. Если при рандомном тыке каждый раз сверяться с дополнительным массивом, то при 100 на 100 шанс выбора последнего не выбранного элемента 1 к 10000, а это чёт долго будет. Можно как-нибудь оптимизировать?
0
Эксперт Pascal/Delphi
2348 / 1269 / 1481
Регистрация: 29.08.2014
Сообщений: 4,580
16.05.2018, 10:32 4
Цитата Сообщение от BabuinSlayer Посмотреть сообщение
Если при рандомном тыке каждый раз сверяться с дополнительным массивом, то при 100 на 100 шанс выбора последнего не выбранного элемента 1 к 10000, а это чёт долго будет. Можно как-нибудь оптимизировать?
если попадает в выбранный, выбираете ближайший к нему справа или слева.
0
0 / 0 / 0
Регистрация: 20.03.2018
Сообщений: 19
16.05.2018, 12:15  [ТС] 5
Не сильно поможет наверное, та же ситуация будет, когда мало не выбранных останется. Но хотя да, можно что-то типа бинарного поиска сделать и проверять сначала всё слева, а потом справа если не найдётся.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30166 / 19703 / 7702
Регистрация: 22.10.2011
Сообщений: 34,349
Записей в блоге: 6
16.05.2018, 13:45 6
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Имеешь массив 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2018, 18:13

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Сделать так чтобы элементы массива вводил я, а не программа выдавала их рандомно
Ввести двумерный массив A2×5. Определить в нём среднее геометрическое модулей отрицательных...

Сделать так чтобы элементы массива вводил я, а не программа выдавала их рандомно
Ввести двумерный массив AN×M. Каждую вторую строку в массиве заменить остатками от деления её...

Сделать так чтобы элементы массива вводил я, а не программа выдавала их рандомно
Ввести целочисленный двумерный массив AN×M, вывести его. Найти сумму его чётных элементов,...

Файл: Как сделать так, чтобы числа в файл были прописаны не рандомно?
Здраствуйте, дан код: #include "stdafx.h" #include <iostream> #include <fstream> #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.