|
0 Всего найдено: 20
nKrow
Сообщение
22/03/2009 11:33
Копия темы
Random в Delphi Уважаемые коллеги. Столкнулся с проблемой организации random'a. Чтобы было понятнее: делаю тест, вопросы берутся из базы данных (например, в базе 200 вопросов). Выводиться они должны рандомайзом, но не повторяться. Все ничего если нужно вывести 10 вопросов из 200 (берешь рандомом номер вопроса и проверяешь выводил такой или нет, если выводил то снова рандом). Пролема же с тем, если нужно вывести 190 вопросов из 200 не повторяясь (процесс, естественно, подвисает). Может быть кто-то сталкивался с подобного рода проблемой. Как ее можно решить? Заранее спасибо.
ToSm
Сообщение
22/03/2009 11:35
Копия темы
Рендомируй сначала 10 лишних, потом делай выборку из остальных.
stepdev
Сообщение
22/03/2009 11:35
Копия темы
список, делаете список, берете рандом число от количества элементов в списке индекс элемента в списке, затем этот элемент из списка удаляете
Trex
Сообщение
22/03/2009 11:37
Копия темы
Делай список вопросов,после вывода вопроса удаляй его из списка.Это как бы дополнение .
nKrow
Сообщение
22/03/2009 11:44
Копия темы
Спасибо. А нет информации по тому как рандом из списка брать?
Trex
Сообщение
22/03/2009 11:52
Копия темы
Рандомом от 0 до ко-ва вопросов в списке.Главное не забывай убирать элементы из списка.
stepdev
Сообщение
22/03/2009 11:52
Копия темы
например так var mylist:TList; ... var I: Integer; P: Pointer; begin I := Random(mylist.count-1); P := mylist[I]; // вывод mylist.Delete(I); end
creart2
Сообщение
22/03/2009 12:21
Копия темы
Ну тогда правильно выше написали — список вопросов, и вытягиваем по-одному, удаляя после этого. Или создать,например, массив, куда записывать id тех вопросов, что уже показывались. Ну и дальше смотреть что бы не было повторных.
msobolev
Сообщение
22/03/2009 12:29
Копия темы
а потом поиск по массиву? это дополнительное время... Решение Дмитрия идеально в принципе, только не "-1" а просто mylist.Items.count иначе последний элемент не возьмется.
nKrow
Сообщение
22/03/2009 12:31
Копия темы
Все, разобрался =)))) Последний элемент действительно включать не нужно. И нужно делать стопор, чтобы не было ошибки на пустой список.
creart2
Сообщение
22/03/2009 12:41
Копия темы
Ах, туплю, да. Правда твоя) В списке id хранить нужно, если много вопросов и не все нужно загружать, думаю.
stepdev
Сообщение
22/03/2009 13:12
Копия темы
mylist в моем случае имеет тип TList, а в вашем видимо TListBox, у которого есть свойство Items типа TStrings который ходит своими корнями в класс TList =)
msobolev
Сообщение
22/03/2009 13:17
Копия темы
вот в этом все программисты один критикует, предлагая свое решение, второй стоит на своем =)))))
avas-ton
Сообщение
23/03/2009 15:25
Копия темы
Выбираешь случайное число от 1 до 200. Меняешь его местами с 200-м Выбираешь случайное число от 1 до 199 Меняешь его местами с 199-м ... Осталось сделать цикл И никаких списков не надо.
nKrow
Сообщение
24/03/2009 09:18
Копия темы
0
Сделал очень просто уже. Взял компонент TListBox, перед отбором загружаю в него номера вопросов попорядку от 1 до N. Потом рандомно беру значение от 1 до количества записей в TListBox. Допустим выпало число 5. Получаю что 5 позиции соответствует 5 вопрос. Вывожу его и удаляю 5-ю позицию. Таким образом при выпадании снова позиции номер пять, вопрос в ней будет уже 6. var i : Integer; begin i := Random(ListBox1.Count 1); Label1.Caption := ListBox1.Items[i]; ListBox1.Selected[i] := True; ListBox1.DeleteSelected; |
Выразить восторг, поругаться или предложить что-нибудь можно на форуме |
Для обсуждения этого сервиса так же есть темы на фрилансе по поиску , флудотопу ,и по удалённым сообщениям ,и по Актуальным/популярным темам , и по топу "кто кому больше наотвечал" |