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

Вниз

"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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.035 c
15-1146932102
Anatoly Podgoretsky
2006-05-06 20:15
2006.06.04
Купил монитор


2-1148159280
<X>
2006-05-21 01:08
2006.06.04
Получить Index выделеных ячеек.


1-1145985711
Dmitry_177
2006-04-25 21:21
2006.06.04
Класс для хранения в файле списка списков


2-1148043251
oleg_
2006-05-19 16:54
2006.06.04
Как пустить php из под IdHTTPServer


2-1147603293
Andrey235
2006-05-14 14:41
2006.06.04
как заменить вайл используемый Виндой





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский