Форум: "Начинающим";
Текущий архив: 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 и т.д. для всех пар. Не должно быть никакой значимой зависимости, ... что и наблюдается в случае функции randomF:\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.04 c