Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];

Вниз

Неповтояющийся RANDOM   Найти похожие ветки 

 
Заглянувший   (2009-10-23 21:40) [0]

Как получить Random с неповторяющимися числами?
К примеру, пусть RandEx такая функция, вызываем RandEx(10) в цикле на 10 иттераций и после каждого прохода эта функция должна выдавать псевдослучайное неповтояющееся число. Как такое сделать?????


 
Омлет   (2009-10-23 22:01) [1]

Например, использовать булевый массив уже занятых значений.

repeat
 x := RandEx(10);
until not mas[x];
mas[x] :=True;

Либо, при попадании на уже занятое значение, смещать вправо или влево, до свободного. Так, наверное, быстрее.


 
Сергей М. ©   (2009-10-23 22:04) [2]

Забей в массив или список последовательный ряд чисел от 0 до 9
Пока длина L этого массива или списка не равна нулю выполняй итерацию  цикла, в которой выбирай из массива или списка элемент с индексом Random(L) и тут же удаляй этот элемент, так чтобы L уменьшалась на единицу.


 
Anatoly Podgoretsky ©   (2009-10-23 22:25) [3]

> Сергей М.  (23.10.2009 22:04:02)  [2]

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


 
Сергей М. ©   (2009-10-23 22:28) [4]


> Anatoly Podgoretsky ©   (23.10.09 22:25) [3]


> как быть с последним элементом


А что с ним не так ?


> принято не удалять а перетасовывать значения списка


Нашиша его тасовать, если в каждой итерации извлекается случайный эл-т из оставшихся ?


 
Anatoly Podgoretsky ©   (2009-10-23 22:40) [5]

> Сергей М.  (23.10.2009 22:28:04)  [4]

Напиши код, тогда и поговорим.


 
Сергей М. ©   (2009-10-23 22:47) [6]


> Anatoly Podgoretsky ©   (23.10.09 22:40) [5]


Да я уже упарился его тут писать)
Вопрос-то этот здесь возникает чуть ли не раз в пару недель ..
Нехай автор потрудится, ничего архисложного в реализации предложенной логики нет - всего-то десяток строчек..


 
Anatoly Podgoretsky ©   (2009-10-23 23:35) [7]

> Сергей М.  (23.10.2009 22:47:06)  [6]

Да я про текст не для автора, а для предметного разговора.


 
Сергей М. ©   (2009-10-23 23:44) [8]


> Anatoly Podgoretsky ©   (23.10.09 23:35) [7]


Вот ты ж провокатор)

Но изволь, раз уж для разговора:

var
 List: TList;
..
for i := 0 to 9 do
 List.Add(Pointer(i));

while List.Count > 0 do
begin
  Index := Random[List.Count];
  Memo.Lines.Add(IntToStr(Integer(List[Index])));
  List.Delete(Index);
end;


 
Anatoly Podgoretsky ©   (2009-10-24 00:35) [9]

> Сергей М.  (23.10.2009 23:44:08)  [8]

Рандом возвращает номер на единицу меньше, чем N, как ты думаешь, что он может вернуть для N = 0
Вот для этого я и просил код.


 
Германн ©   (2009-10-24 01:39) [10]


> Anatoly Podgoretsky ©   (24.10.09 00:35) [9]
>
> > Сергей М.  (23.10.2009 23:44:08)  [8]
>
> Рандом возвращает номер на единицу меньше, чем N, как ты
> думаешь, что он может вернуть для N = 0
> Вот для этого я и просил код.
>

Как был язвой, так и остаёшься ею. Очень хорошо.
Рад что ты не покинул наши ряды язв ДМ! Скорблю что наши ряды покинул Кэтмар.
:)


 
Омлет   (2009-10-24 01:53) [11]

> Скорблю что наши ряды покинул Кэтмар.

Он что ли опять возвращался? ))


 
Германн ©   (2009-10-24 02:02) [12]


> Омлет   (24.10.09 01:53) [11]
>
> > Скорблю что наши ряды покинул Кэтмар.
>
> Он что ли опять возвращался? ))
>

И не один раз. :)
Ждём следующей реинкарнации.


 
Григорьев Антон ©   (2009-10-24 08:58) [13]

А в целом какая задача стоит? Зачем нужны неповторяющиеся числа? Просто есть некоторые задачи, для которых на первый взгляд нужны неповторяющиеся случайные числа, но их можно решать и другими алгоритмами, где требование неповторения отсутствует.


 
oldman ©   (2009-10-24 09:11) [14]


> Заглянувший   (23.10.09 21:40)  


заводится массив a[10], заполняется нулями
функция, получив случайное число i проверяет a[i]
если 0, a[1]:=1, i возвращается
если 1, генерим новое i

у меня так работало на 100 элементах (делал когда-то давно тест-опросник)
работало довольно шустро, для проверки делал 100 иттераций, возвращало все числа от 1 до 100 в случайной последовательности


 
sniknik ©   (2009-10-24 10:25) [15]

> А в целом какая задача стоит?
блин, вот как бы приучить начинающих "какбы програмистов" здесь, решать именно задачу, а не те частные проблемы, что они встретили на пути... ну и вопросы соответственно задавать, без лишних подробностей, они не нужны, но, что решается все таки писать сразу... (ну и задачи "сдать лабу" не катят, это уже более общая, а не программисткая, решаемая).
но похоже отделить реальную задачу от проблем на пути решения для многих просто непосильная задача :)...

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


 
Сергей М. ©   (2009-10-24 11:09) [16]


> Anatoly Podgoretsky ©   (24.10.09 00:35) [9]
>
> > Сергей М.  (23.10.2009 23:44:08)  [8]
>
> Рандом возвращает номер на единицу меньше, чем N, как ты
> думаешь, что он может вернуть для N = 0


А где ты видишь чтобы в этом коде N могло стать равным нулю ?


 
Anatoly Podgoretsky ©   (2009-10-24 11:31) [17]

Ты схитрил


 
oldman ©   (2009-10-24 12:28) [18]


> sniknik ©   (24.10.09 10:25) [15]
> > делал когда-то давно тест-опросник
> вот это как раз та задача когда не повторяющиеся числа нафиг
> не нужны...


ну и чем мой способ хуже твоего?
Ведь чтобы присвоить случайное значение полю сортировки или проверить его с массивом телодвижения те же самые...


 
AIK ©   (2009-10-24 12:47) [19]

Когда-то обращался с похожим вопросом. перемешка эффективней

var
N, j, i, temp: integer;
A: array[0..10] of integer;
begin
N:=10;
Randomize;
for i := 0 to N - 1 do
  A[i] := i + 1;
for i := N - 1 downto 0 do begin
  temp := A[i];
  j := Random(i + 1);
  A[i] := A[j];
  A[j] := temp;
end;
...
end;


MBo ©


 
sniknik ©   (2009-10-24 13:04) [20]

> Ведь чтобы присвоить случайное значение полю сортировки или проверить его с массивом телодвижения те же самые...
в случае с базой все делается в запросе, добавляешь там поле rnd() и ордер by по нему. проверки не нужны (какой еще массив если у тебя сами вопросы опроса в таблице?), а запрос ты так и так делаешь...

но вообще конечно можно придумать ситуации когда сортировка займет даже больше "телодвижений".

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


 
oldman ©   (2009-10-24 13:37) [21]


> sniknik ©   (24.10.09 13:04) [20]
> дело не в этом, я вовсе не хотел показать, что мой вариант
> оптимальнее


тогда пардон :)


 
Sha ©   (2009-10-24 16:12) [22]

> AIK ©   (24.10.09 12:47) [19]
> Когда-то обращался с похожим вопросом. перемешка эффективней

Это не перемешивание, а случайный выбор из оставшихся элементов.


 
AIK ©   (2009-10-24 16:24) [23]


> Это не перемешивание, а случайный выбор из оставшихся элементов.


Это перемешивание, смотри внимательней


 
Сергей М. ©   (2009-10-24 16:26) [24]


> Anatoly Podgoretsky ©   (24.10.09 11:31) [17]
>
> Ты схитрил


Где ?)


 
Sha ©   (2009-10-24 16:50) [25]

> AIK ©   (24.10.09 16:24) [23]
> Это перемешивание, смотри внимательней

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

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


 
AIK ©   (2009-10-24 17:41) [26]


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


Ну уж если рассуждать так как ты говоришь то вот

var
N, j, i, l, temp: integer;
A: array[0..9] of integer;
begin
N:=10;
Randomize;
for i := 0 to N - 1 do
  A[i] := i + 1;
for i := 0 to 9 do begin
  temp := A[i];
  l:=  Random(9);
  j := Random(9);
  A[i] := A[j];
  A[j] := temp;
end;


 
Anatoly Podgoretsky ©   (2009-10-24 18:16) [27]

> Сергей М.  (24.10.2009 16:26:24)  [24]

Сделал не так, как я ожидал.


 
Сергей М. ©   (2009-10-24 18:21) [28]


> Anatoly Podgoretsky ©   (24.10.09 18:16) [27]


Не знаю уж что ты там ожидал, но [8] полностью соответствует [2]


 
Sha ©   (2009-10-24 18:26) [29]

> AIK ©   (24.10.09 17:41) [26]

Не понял, зачем там нужна переменная l.


 
AIK ©   (2009-10-25 07:46) [30]

упс, не доконца переправил

var
N, j, i, l, temp: integer;
A: array[0..9] of integer;
begin
memo1.Clear;
N:=10;
Randomize;
for i := 0 to N - 1 do
  A[i] := i + 1;
for i := 0 to 9 do begin
  L:=  Random(9);
  j := Random(9);
  temp := A[l];
  A[L] := A[j];
  A[j] := temp;
end;
...
end;



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.007 c
6-1197208549
Свой
2007-12-09 16:55
2009.12.13
ASP и .NET


2-1254770157
laari
2009-10-05 23:15
2009.12.13
Delphi+dbf. Определение пути к файлам базы.


15-1255552208
Юрий
2009-10-15 00:30
2009.12.13
С днем рождения ! 15 октября 2009 четверг


2-1256647118
И. Павел
2009-10-27 15:38
2009.12.13
Определения щелчка на Серых полях в StringGrid


15-1255113419
KilkennyCat
2009-10-09 22:36
2009.12.13
Непонятно, вечный двигатель?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский