Поисковая форма:) поиск по free-lance.ru Топ/история/обновления фриланса, по разным параметрам (темы, сообщения, пользователи...) Автоматическое удаление постов от ненужных юзеров в топике (php скрипт) Досье(точный ник)
 

Ник (или часть ника):
?
Какой текст ищем:
?
Раздел блогов:
За срок
дней
Тип поиска: (по вхождению: по тексту гуг выдаст посты с "гуг", "гугл", "огугл"; "полнотекстовый": по тексту "гуг" выдаст посты только с "гуг")
По вхождению строки:  Полнотекстовый: 
(поиск не 100% актуальный, есть определённая задержка при обновлении данных для поиска. )
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:08 Копия темы
Не помню уже, а randomize; эту проблему не решает?
nKrow Сообщение 22/03/2009 12:13 Копия темы
Нет (
creart2 Сообщение 22/03/2009 12:21 Копия темы
Ну тогда правильно выше написали — список вопросов, и вытягиваем по-одному, удаляя после этого.
Или создать,например, массив, куда записывать id тех вопросов, что уже показывались. Ну и дальше смотреть что бы не было повторных.
msobolev Сообщение 22/03/2009 12:29 Копия темы
а потом поиск по массиву? это дополнительное время... Решение Дмитрия идеально в принципе, только не "-1" а просто mylist.Items.count – иначе последний элемент не возьмется.
msobolev Сообщение 22/03/2009 12:30 Копия темы
* поправочка
I:=Random(mylist.Items.Count)
nKrow Сообщение 22/03/2009 12:31 Копия темы
Все, разобрался =)))) Последний элемент действительно включать не нужно. И нужно делать стопор, чтобы не было ошибки на пустой список.
creart2 Сообщение 22/03/2009 12:38 Копия темы
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-м

...

Осталось сделать цикл
И никаких списков не надо.
InformStream Сообщение 24/03/2009 07:55 Копия темы
nKrow Сообщение 24/03/2009 09:18 Копия темы
Сделал очень просто уже. Взял компонент 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;
0

©2008 edogs egods
Выразить восторг, поругаться
или предложить что-нибудь можно на форуме
Для обсуждения этого сервиса так же есть темы на фрилансе по
поиску , флудотопу ,и по удалённым сообщениям ,и по Актуальным/популярным темам , и по топу "кто кому больше наотвечал"