Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.04;
Скачать: CL | DM;

Вниз

"random чисел" или "дорогое время"   Найти похожие ветки 

 
Officeman   (2006-05-18 08:22) [0]

"random чисел" или "дорогое время"

ЗАДАЧА:

В цикле, random выдавать число, но при этом сократить общее время выполнения задачи.
хронометраж цикла от 0 до 10"000  (100"000).

при    

randomize;
for X:=0 do 10000 do
begin
  inc:=random(4);  
  Memo1.lines.add(inttostr(inc));
end;


Сформируется последовательность:

0000222220000011111133333

так как для норманой работы Random должен иметь задержку(таймаут),
например


randomize;
for X:=0 do 10000 do
begin
  sleep(150); ///////////////////////////
  inc:=random(4);  
  Memo1.lines.add(inttostr(inc));
end;


тогда числа будут выдаваться такие:

0121223223101333012210011  , т.е. более ХАОТИЧНЫЕ. это мне и нужно.

но текущая задержка, в 150 = а это 0,15 секунды * 10"000 = 25 минут !!!!!!!!
реально замедляет процесс. что делать?

пробовал ставить  "randomize;" в тело цикла. ничего неизменилось.
без таймаута последовательность random чисел плохая.

посоветуйте. кто сталкивался?


 
MBo ©   (2006-05-18 08:26) [1]

randomize делать один раз при старте программы или перед циклом.
случайное число, выдаваемое random  - НЕ ЗАВИСИТ от задержек, так как вычисляется только на основе предыдущего счетчика RandSeed.
Приведенная последовательность 0000222220000011111133333 может быть только при постоянном вызове randomize в цикле, что совершенно неправильно.


 
Johnmen ©   (2006-05-18 09:43) [2]

Вообще-то начинать надо было с примера, приведённого в randomize+F1


 
Officeman   (2006-05-18 11:37) [3]

погодите ка, так вот так и делал же:


randomize;      // инициализируем
for X:=0 do 10000 do          // цикл
begin
 inc:=random(4);                   // получаем
 Memo1.lines.add(inttostr(inc));    // выводим
end;


но при этом последовательноть выходит такая

0000222220000011111133333

попробуйте сами.)


 
wal ©   (2006-05-18 11:54) [4]

Попробовал:
11331222233213232100033123212133001232023003231230312210003010311232102023233121 2110030302020000310322221302203323013320113023223003210...
Что, собственно говоря, и следовало ожидать (не числа, конечно, а тенденцию).


 
Officeman   (2006-05-18 11:56) [5]

пойду код проверять. задания была такое:

сгенерировать табличку с данными
10"000 столбов, на 200 строк.

во время работы обработки, цикл идёт по столбцам, используя текущие значения ячеек. в дополнительные таблички записывается статистика - результатов основной обработки на счёт каждого столбца (спец-ый лог). по специальному методу. самое главное чтобы последовательность ЧИСЕЛ в СТОЛБЦЕ была как можно хаотичнее недопуская повторений одного и того же числа более 3 раз.

, где значения ячеек от 1 до 3.

написал несколько доп.процедурок. всё тип-топ. но использовал ListView )
сейчас переписываю под массив, бьюсь за уменьшение времени - создания табличек.


 
Officeman   (2006-05-18 11:57) [6]

to [4]
пошёл проверять. наверно гедто чёто упустил


 
wal ©   (2006-05-18 12:10) [7]


> [5] Officeman   (18.05.06 11:56)
Код из [3] не гарантирует этого:

> недопуская повторений одного и того же числа более 3 раз


 
ЮЮ ©   (2006-05-18 12:19) [8]

>Код из [3] не гарантирует этого:

Такого не сможет создать даже Господь:

недопуская повторений одного и того же числа более 3 раз.
причем эти числа 0 1 2 3, а ячеек для их размещения - 200


 
TUser ©   (2006-05-18 12:24) [9]

> последовательность random чисел плохая

Существует много способов проверки последовательности чисел на псевдослучайность. Тут все зависит от твоей конкретной задачи. Самое примитивное - 100001 раз сгенерировать случайно число и посчитать сколько раз 1 получается после 0, 2 после 0, 1 после 1 и т.д. для всех пар. Не должно быть никакой значимой зависимости, ... что и наблюдается в случае функции random
F:\users\evgeniy\temp>rand.exe 4
       0       1       2       3
0       6190    6169    6208    6302
1       6255    6204    6166    6358
2       6054    6410    6297    6191
3       6369    6200    6281    6346

F:\users\evgeniy\temp>rand.exe 7
       0       1       2       3       4       5       6
0       2049    2059    2017    2043    2031    2068    2066
1       2081    2062    2042    2046    1986    2091    2162
2       2041    2107    2051    2027    2021    2039    1990
3       2075    2046    2019    2019    1991    2029    2057
4       1972    2058    2055    2017    1991    1925    2046
5       2027    2109    2027    2021    2016    2133    1966
6       2088    2029    2065    2063    2028    2013    2036


http://monkey.belozersky.msu.ru/~evgeniy/rand.dpr

Тем не менее существуют ситуации, когда случайности, присущей функции random, недостаточно. Для этих ситуаций надо реализовывать собственные псевдослучайные функции. Хорошим пособием по теме является

http://monkey.belozersky.msu.ru/~evgeniy/Knut_2_tom(rus).djvu (6.3M)


 
Officeman   (2006-05-18 12:53) [10]

TUser меня понял правильно. числа ОДНОЗНАЧНЫЕ )  от 1 до 3

задача: чтобы числа в столбике, сверху вниз,  шли как можно хаотичнее не повторяясь подряд более 3 раз. т.е.

1
1
2
1
3
1
2
2
3
2
1 //
1 //  не более трёх раз
1 //
2
2
3 //
3 // не более трёх раз
3 //

я делал так:  (пример)

при генерации random каждого нового числа X2, сверял его с предыдущим X1.
и если X2=X1, тогда  str:=str+intostr(X2); иначе str:="" //обнуляем.

Таким образом получится последовательность одинаковых чисел.
считаем сколько одинаковых чисел в последовательности:

Если  length(Str)>2  Тогда  
1:
X2:=random(4)
Если X2=X1 тогда goto 1;

Вывод числа X2

почти такойже код использую сейчас.
работает нормально.


 
MBo ©   (2006-05-18 13:33) [11]

> как можно хаотичнее не повторяясь подряд более 3 раз
Это противоречие.
Хаотичность не исключает появление числа много раз подряд, даже наоборот - если в последовательности, состоящей из малого количества разных элементов, нет повторов, в том числе и довольно длинных серий - это крайне подозрительно, и такая последовательность - искусственно упорядочена.


 
tsa   (2006-05-18 13:42) [12]

Хочешь больше хаотичности - бери каждое n-е число, остальные выбрасывай.
(например каждое третье, 3 сгенерировал, два выкинул, одно оставил)


 
MBo ©   (2006-05-18 13:50) [13]

>tsa   (18.05.06 13:42) [12]
это абсолютно ничего не изменит


 
Officeman   (2006-05-18 14:12) [14]

;)



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

Текущий архив: 2006.06.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.049 c
15-1146945640
GanibalLector
2006-05-07 00:00
2006.06.04
Кто помнит pascal...


15-1147434041
oldman
2006-05-12 15:40
2006.06.04
Какой процесс работает? (задачка для новичков)


2-1147766116
roman_ln
2006-05-16 11:55
2006.06.04
Помогите начинающему составить программу!!!


15-1146930296
Sergey Masloff
2006-05-06 19:44
2006.06.04
Мотивация при смене места работы. Какой % прибавки оклада


15-1147086321
boalse
2006-05-08 15:05
2006.06.04
Математики, ау!