| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Полностью случайные числа |
| Автор: InfMag 16.5.2005, 17:13 | ||
Я вот помню такое дело:
Но числа генерируются именно от нуля и подсчет полной случайности доходит только до секунд. А мне нужно, чтобы юзать от определенного числа до другого определенного и с точностью до миллисекунд. |
| Автор: _hunter 16.5.2005, 18:17 |
| ну и юзай RandomRange() ( только при чем тут время? ) |
| Автор: NoeR 16.5.2005, 18:32 | ||
| Я тоже ниче не понял, но может тебе надо от 1 до 60? Тогда так:
|
| Автор: InfMag 16.5.2005, 22:08 |
| _hunter Время играет самую важную роль якобы случайности. Компьютер работает строго по математическим расчетам и сгенерировать случайное число он никак не может. А случайное число - это означает время поносилованное по формуле... Вобщем думаю вы поймете... В PHP есть функция mt_rand() и вней можно указывать время для формулы. Вобщем в ней важно то, что она генерирует точно случайные числа и от пределенных чисел. Типа mt_rand(25, 55) Теперь понятно? |
| Автор: Амортизатор 16.5.2005, 23:18 |
| Говорю как бывший физик. Вообще полностью случайные числа существуют только в учебниках по теории вероятности |
| Автор: InfMag 17.5.2005, 05:04 |
| Амортизатор Да блин! Ты как не втыкаешь? Полностью случайными числа на компе считаются расчитанными по формуле с точностью до миллисекунд. Все, пошел искать в просторах. |
| Автор: InfMag 17.5.2005, 05:16 |
| А надо было сразу юзать сарч: http://forum.vingrad.ru/index.php?showtopic=35266 Совсем то, что я хотел увидеть, не увидел. В си наверно нет такой функции. Буду писать свою. |
| Автор: Амортизатор 17.5.2005, 09:58 |
| Кстати, я использую функцию random(int), в ней непредсказуемости как в табуретке. При каждом запуске практически одно и то же. Как добыть нормальную функцию? |
| Автор: _hunter 17.5.2005, 10:18 | ||
ты в этом уверен? точнее ты знаеш какую именно оно роль играет? ( а не самую важную ) функцию для получения случайного числа на промежутке я тебе написал. напиши чем она тебя не устраивает ( с аргументами ) |
| Автор: NoeR 17.5.2005, 14:11 | ||
Разве практически? |
| Автор: InfMag 17.5.2005, 19:59 | ||||||
| Амортизатор Напиши, например в OnCreate программы:
И вот функция:
Если пишем:
то возвращает либо 5, либо 6, либо 7, либо 8, либо 9 и либо 10. |
| Автор: _hunter 17.5.2005, 20:04 |
| а ты что хотел??? |
| Автор: InfMag 17.5.2005, 20:07 |
| _hunter Я эту функцию только что написал. Это я и хотел. |
| Автор: _hunter 17.5.2005, 22:59 |
| а при чем точность до миллисекунд? |
| Автор: InfMag 18.5.2005, 17:14 | ||
| _hunter Точность расчета случайности по формуле. Вот возьми:
Если ты в течении этой же секунды снова запросишь рандом, то он вывелет тоже число. ЗЫ: Серьезно: ты вобще чтоль никаких представлений не имеешь о случайности чисел в компьютере? Добавлено @ 17:16 ИМХО: |
| Автор: NoeR 18.5.2005, 17:45 | ||||
| InfMag Это у тебя компьютер глючит! Числа полностью и еще раз полностью разные!
Полученные данные в мемо1:
Ну, давай, что еще умного скажешь? Ты видел код на асме, который рандом делает, доставая время, что так выделываешься о том, что ты хорошо в этом разбираешься? Ты не подумал что там еще пару десятков строчек кода, а не одна как у тебя, которая это время извращенно размножает… |
| Автор: InfMag 18.5.2005, 17:53 |
| NoeR Хм. Не знал. Просто ты в цикле все время вызываешь Randomize(); и видимо он все время запрашивает время. ЗЫ: Умным хочу показаться не я, а - ты. Ты говоришь, что я хочу показаться умным, а я говорю ту теорию, которую знаю и пытаюсь доказать очевидное. А зачем мне казаться умным и с какой целью? Ведь я прихожу на форум за вопросами и если что-то знаю, то пытаюсь помочь, а в данный момент ты делаешь так, чтобы я не впихивал сюда своего мнения aka не помогал. |
| Автор: InfMag 18.5.2005, 18:04 | ||
Вот и без лишних OnCreate'ов...
NoeR Видишь, на этот раз я изменил свои понятия об этой функции, потом что ты пролил свет на очевидное. |
| Автор: NoeR 18.5.2005, 18:05 | ||||
Я не люблю людей, которые, не проверяя что-то, делают и гонят на безобидную функцию рандом. И ИМХО своим ответам, я ни в одном кусочке не показал того, что я умный, я просто помогаю тебе же понять то, что ты ошибаешься, вот и все
Полученные данные:
Добавлено @ 18:09 Кстати твоя функция использует рандом так или иначе, и твоя формула, ничего не делает - абсолютно, она ничем не помогает рандому сделать случайное число... |
| Автор: _hunter 18.5.2005, 18:12 |
| я то представление имею... а ты кажись нет. ты, например, знаеш что от времени зависит только первый вызов ( потому ка инициализируется генератор ( randomixe() ) а остальные числа генерятся на основе предыдущих? + тебя это может удивит, но Randomize(); не инициализирует random() его нужно инициализировать randomize() |
| Автор: InfMag 18.5.2005, 18:16 |
| _hunter Но первое то обращение все равно юзает время. А Randomize() и randomize() одно и тоже. Слушайте, давайте не будем драться. Вы просто сразу мне не показали, что эта функция действительно лучше. Не зачем создавать проблему из-за мелочи. |
| Автор: NoeR 18.5.2005, 18:21 |
| А ты не знал что ли? Кстати в этом топике других функций я не вижу, поэтому показывать даже не на что |
| Автор: _hunter 18.5.2005, 18:52 |
| первое юзает, но это не имеет никакого отношения к твоей проблеме: ты писал что у тебя нет разницы между i-тым и i+1-м значениями... Randomize() и randomize() это абсолютно не одно и то же... они из разных библиотек, как минимум. |
| Автор: InfMag 18.5.2005, 19:16 | ||
| _hunter Ну вроде уже решили проблему. Вот так:
Вся фишка в том, что у функции random(100) будет выдаваться от 0 до 99, а мне нужно было от 0 до 100, причем не только так, но чтобы еще можно было указать от 50 до 100. Проблема решена. |
| Автор: NoeR 18.5.2005, 20:32 |
| Ё-моЁ... а ты меня слушаешь? Я же сказал: random(51)+50; //Выдаст от 50 до 100! От 0 до 100:random(101) вот и все, твой код больше памяти хавает, чем надо... (Помогаю оптимизировать и не писать лишнего... Отвечать не обязательно) |
| Автор: codelord 18.5.2005, 20:58 |
| ......................................................sorry отвечал на первом листе |
| Автор: _hunter 18.5.2005, 22:57 |
| InfMag, а чем твоя функция отличается от приведеной мной сколько-то постов назад RandomRange()? |
| Автор: Guest 25.6.2005, 11:34 |
| |
| Автор: Dubinsky 1.7.2005, 12:35 |
| Ну вообщем есть у Рандома реиницилизатор (srand(int)) берем и в качестве аргумента указываем (ну например) текущий тик процессора умноженный на напряжение АГП слота деленный на обороты кулера в степени версии Виндовса минус объём харда ... и так до бесконечности . после берём рандом и пусть кто то мне просчитает какой он будет в определённое время ? ну и как ? вы увидите в этом зависимость ? ну ну ... |
| Автор: NewDracon 5.8.2005, 14:22 | ||
| Не понял до конца о чем вы спорите, но у меня даже после Randomize() выдавались одинаковые числа долго мучился (нужно было очень) и вот код где-нибудь в начале:
выдаются что ни на есть рандомно! |
| Автор: Dubinsky 5.8.2005, 15:14 |
| специально повторю хелп : случайные числа должны как то инициализироватся , если нет он выдаёт всегда и везде ОДНУ И ТУ ЖЕ ПОСЛЕДОВАТЕЛЬНОСТЬ СЛУЧАЙНЫХ чисел ! это отладочный режим рандома ! чтобы в программе можно было следить за глюками , если они возникают при определённом случайном числе (ну например выход за пределы списка каким то случайным числом) то если диапазон случайных чисел большой , дождатся следующего глюка при следующем запуске будет трудно (да и глюк будет появлятся в разное время) , а так всё время одинаковый ряд , глюк будет возникать в одно и то же время в одних и тех же условиях. во время отладки инициализация отрубается (ну там командой препроцессора) а в релизе врубается. |
| Автор: p0s0l 6.8.2005, 16:50 |
| Вызывать Randomize в цикле перед каждым Random-ом не нужно, т.к. это портит распределение случайной величины; не известно, какие свойства будут у такого распределения. Ну и во-вторых, не известно как сработает Randomize, т.е. каким способом он получает время ? Таймеры изменяют своё значение в дискретные моменты времени, и если период этот большой, то может получиться так, что последовательный вызов нескольких Randomize выдаст одни и то же значения, а значит, и Random тоже выдаст абсолютно одинаковые числа... Например, в Delphi реализация Randomize выглядит следующим образом (в Builder скорее всего также): вызывается QueryPerformanceCounter, если результат нулевой, то вызывается GetTickCount. Как видно, есть вероятность того, что будет работать GetTickCount (правда не знаю, в каких случаях не сработает QueryPerformanceCounter), в этом случае мы получим огромное количество одинаковых идущих друг за другом чисел... Поэтому правильнее 1 раз вызвать Randomize, а потом просто вызывать Random... |
| Автор: InfMag 15.8.2005, 10:53 | ||||
| Да! Да! Народ, я написать забыл. Чтобы о Randomize(); и randomize(); не говорили они не помогают! Если написать Randomize(); один раз, то числа будут выдаваться случайно, но проблема исходит от того, что обновление хэша времени происходит тока раз в секунду. Я сделал примерчик, тыкаю на кпопку... Вобщем интервал между обновления числа равен ЦЕЛОЙ СЕКУНДЕ!!! А что если операция вызывается перетасовкой через цикл? Юзать таймер на одну секунду и ждать пока програ проделает действия с этим Randomize();?! Просто смех! Вот как написал я и у меня все идеально работает:
Вот так все работает у меня тик так. Один раз зделал и больше не насиловал Randomize(); А те люди, которые его так и юзали, наверно уже много глючных проектов наделали Добавлено @ 10:56 Сорри, у меня форма не стандартно называется...
|