Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полностью случайные числа 
:(
    Опции темы
InfMag
Дата 16.5.2005, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



Я вот помню такое дело:
Код

Randomize();
int rand_num = random(100);

Но числа генерируются именно от нуля и подсчет полной случайности доходит только до секунд.
А мне нужно, чтобы юзать от определенного числа до другого определенного и с точностью до миллисекунд. smile
PM   Вверх
_hunter
Дата 16.5.2005, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



ну и юзай RandomRange()
( только при чем тут время? )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
NoeR
Дата 16.5.2005, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 233
Регистрация: 6.2.2005

Репутация: нет
Всего: нет



Я тоже ниче не понял, но может тебе надо от 1 до 60?
Тогда так:
Код

int rand_num = random(60)+1;

--------------------
По факту пропажи мужа, возбуждено... Два соседа.Если у Вас проблемы с ребенком, спросите у жены, может, это не Ваши проблемы!>>> NoeR++ <<<
PM MAIL ICQ   Вверх
InfMag
Дата 16.5.2005, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



_hunter
Время играет самую важную роль якобы случайности.
Компьютер работает строго по математическим расчетам и сгенерировать случайное число он никак не может. А случайное число - это означает время поносилованное по формуле...
Вобщем думаю вы поймете...
smile
В PHP есть функция mt_rand() и вней можно указывать время для формулы. Вобщем в ней важно то, что она генерирует точно случайные числа и от пределенных чисел. Типа mt_rand(25, 55)
Теперь понятно? smile
PM   Вверх
Амортизатор
Дата 16.5.2005, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 17.4.2005
Где: в Караганде

Репутация: нет
Всего: 8



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


--------------------
Поехали!
PM MAIL   Вверх
InfMag
Дата 17.5.2005, 05:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



Амортизатор
Да блин! Ты как не втыкаешь? Полностью случайными числа на компе считаются расчитанными по формуле с точностью до миллисекунд.
Все, пошел искать в просторах.
PM   Вверх
InfMag
Дата 17.5.2005, 05:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



А надо было сразу юзать сарч:
http://forum.vingrad.ru/index.php?showtopic=35266
Совсем то, что я хотел увидеть, не увидел. В си наверно нет такой функции. Буду писать свою. smile
PM   Вверх
Амортизатор
Дата 17.5.2005, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 17.4.2005
Где: в Караганде

Репутация: нет
Всего: 8



Кстати, я использую функцию random(int), в ней непредсказуемости как в табуретке. При каждом запуске практически одно и то же. Как добыть нормальную функцию?


--------------------
Поехали!
PM MAIL   Вверх
_hunter
Дата 17.5.2005, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



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

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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
NoeR
Дата 17.5.2005, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 233
Регистрация: 6.2.2005

Репутация: нет
Всего: нет



Цитата
Кстати, я использую функцию random(int), в ней непредсказуемости как в табуретке. При каждом запуске практически одно и то же. Как добыть нормальную функцию?

Разве практически? smile Поставь в каком-нибудь месте Randomize(); и такого не будет...
--------------------
По факту пропажи мужа, возбуждено... Два соседа.Если у Вас проблемы с ребенком, спросите у жены, может, это не Ваши проблемы!>>> NoeR++ <<<
PM MAIL ICQ   Вверх
InfMag
Дата 17.5.2005, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



Амортизатор
Напиши, например в OnCreate программы:
Код

srand((unsigned)time(NULL));

И вот функция:
Код

rnd(int &From, int &To)
{
        return(To-rand()%((To-From)+1));
}

Если пишем:
Код

rnd(5,10);

то возвращает либо 5, либо 6, либо 7, либо 8, либо 9 и либо 10.
PM   Вверх
_hunter
Дата 17.5.2005, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



а ты что хотел???


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
InfMag
Дата 17.5.2005, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



_hunter
Я эту функцию только что написал. Это я и хотел. smile
PM   Вверх
_hunter
Дата 17.5.2005, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



а при чем точность до миллисекунд?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
InfMag
Дата 18.5.2005, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



_hunter
Точность расчета случайности по формуле.
Вот возьми:
Код

Randomize();
ShowMessage(IntToStr(random(100)));

Если ты в течении этой же секунды снова запросишь рандом, то он вывелет тоже число.

ЗЫ: Серьезно: ты вобще чтоль никаких представлений не имеешь о случайности чисел в компьютере? smile
Добавлено @ 17:16
ИМХО: smile
PM   Вверх
NoeR
Дата 18.5.2005, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 233
Регистрация: 6.2.2005

Репутация: нет
Всего: нет



InfMag
Это у тебя компьютер глючит!
Числа полностью и еще раз полностью разные!
Код

procedure TForm1.Button1Click(Sender: TObject);
Var i:integer;
begin
  for i:=1 to 10 do begin
    randomize();
    Memo1.Lines.Add(IntToStr(random(100)));
  end;
end;

Полученные данные в мемо1:
Цитата
4
23
10
39
14
34
7
36
12
17

Ну, давай, что еще умного скажешь? Ты видел код на асме, который рандом делает, доставая время, что так выделываешься о том, что ты хорошо в этом разбираешься?
Ты не подумал что там еще пару десятков строчек кода, а не одна как у тебя, которая это время извращенно размножает…
--------------------
По факту пропажи мужа, возбуждено... Два соседа.Если у Вас проблемы с ребенком, спросите у жены, может, это не Ваши проблемы!>>> NoeR++ <<<
PM MAIL ICQ   Вверх
InfMag
Дата 18.5.2005, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



NoeR
Хм. Не знал. Просто ты в цикле все время вызываешь Randomize(); и видимо он все время запрашивает время.

ЗЫ: Умным хочу показаться не я, а - ты. Ты говоришь, что я хочу показаться умным, а я говорю ту теорию, которую знаю и пытаюсь доказать очевидное. А зачем мне казаться умным и с какой целью? Ведь я прихожу на форум за вопросами и если что-то знаю, то пытаюсь помочь, а в данный момент ты делаешь так, чтобы я не впихивал сюда своего мнения aka не помогал.
PM   Вверх
InfMag
Дата 18.5.2005, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



Вот и без лишних OnCreate'ов...
Код

rnd(int &From, int &To)
{
        Randomize();
        return(To-random((To-From)+1));
}


NoeR
Видишь, на этот раз я изменил свои понятия об этой функции, потом что ты пролил свет на очевидное. smile

Это сообщение отредактировал(а) InfMag - 18.5.2005, 18:04
PM   Вверх
NoeR
Дата 18.5.2005, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 233
Регистрация: 6.2.2005

Репутация: нет
Всего: нет



Я не люблю людей, которые, не проверяя что-то, делают и гонят на безобидную функцию рандом. И ИМХО своим ответам, я ни в одном кусочке не показал того, что я умный, я просто помогаю тебе же понять то, что ты ошибаешься, вот и все smile
Код

procedure TForm1.Button1Click(Sender: TObject);
Var i:integer;
begin
  randomize();
  for i:=1 to 10 do begin
    Memo1.Lines.Add(IntToStr(random(100)));
  end;
end;

Полученные данные:
Цитата
26
67
63
47
22
69
17
15
71
95

Добавлено @ 18:09
Кстати твоя функция использует рандом так или иначе, и твоя формула, ничего не делает - абсолютно, она ничем не помогает рандому сделать случайное число...
--------------------
По факту пропажи мужа, возбуждено... Два соседа.Если у Вас проблемы с ребенком, спросите у жены, может, это не Ваши проблемы!>>> NoeR++ <<<
PM MAIL ICQ   Вверх
_hunter
Дата 18.5.2005, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



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

+ тебя это может удивит, но Randomize(); не инициализирует random()
его нужно инициализировать randomize()


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
InfMag
Дата 18.5.2005, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



_hunter
Но первое то обращение все равно юзает время.
А Randomize() и randomize() одно и тоже.

Слушайте, давайте не будем драться.
Вы просто сразу мне не показали, что эта функция действительно лучше.
Не зачем создавать проблему из-за мелочи.
PM   Вверх
NoeR
Дата 18.5.2005, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 233
Регистрация: 6.2.2005

Репутация: нет
Всего: нет



А ты не знал что ли? smile
Кстати в этом топике других функций я не вижу, поэтому показывать даже не на что smile
--------------------
По факту пропажи мужа, возбуждено... Два соседа.Если у Вас проблемы с ребенком, спросите у жены, может, это не Ваши проблемы!>>> NoeR++ <<<
PM MAIL ICQ   Вверх
_hunter
Дата 18.5.2005, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



первое юзает, но это не имеет никакого отношения к твоей проблеме: ты писал что у тебя нет разницы между i-тым и i+1-м значениями...

Randomize() и randomize() это абсолютно не одно и то же... они из разных библиотек, как минимум.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
InfMag
Дата 18.5.2005, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



_hunter
Ну вроде уже решили проблему.
Вот так:
Код

int rnd(int &From, int &To)
{
        Randomize();
        return(To-random((To-From)+1));
}

Вся фишка в том, что у функции random(100) будет выдаваться от 0 до 99, а мне нужно было от 0 до 100, причем не только так, но чтобы еще можно было указать от 50 до 100.

Проблема решена. smile
PM   Вверх
NoeR
Дата 18.5.2005, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 233
Регистрация: 6.2.2005

Репутация: нет
Всего: нет



Ё-моЁ... а ты меня слушаешь?
Я же сказал: random(51)+50; //Выдаст от 50 до 100!
От 0 до 100:random(101) вот и все, твой код больше памяти хавает, чем надо...
(Помогаю оптимизировать и не писать лишнего... Отвечать не обязательно)
--------------------
По факту пропажи мужа, возбуждено... Два соседа.Если у Вас проблемы с ребенком, спросите у жены, может, это не Ваши проблемы!>>> NoeR++ <<<
PM MAIL ICQ   Вверх
codelord
Дата 18.5.2005, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



......................................................sorry отвечал на первом листе

Это сообщение отредактировал(а) codelord - 18.5.2005, 21:00


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
_hunter
Дата 18.5.2005, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



InfMag, а чем твоя функция отличается от приведеной мной сколько-то постов назад RandomRange()? smile


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Guest
Дата 25.6.2005, 11:34 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











smile
  Вверх
Dubinsky
Дата 1.7.2005, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



Ну вообщем есть у Рандома реиницилизатор (srand(int)) берем и в качестве аргумента указываем (ну например) текущий тик процессора умноженный на напряжение АГП слота деленный на обороты кулера в степени версии Виндовса минус объём харда ... и так до бесконечности .

после берём рандом и пусть кто то мне просчитает какой он будет в определённое время ?

ну и как ? вы увидите в этом зависимость ? ну ну ...
PM MAIL WWW   Вверх
NewDracon
Дата 5.8.2005, 14:22 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Не понял до конца о чем вы спорите, но у меня даже после Randomize() выдавались одинаковые числа smile
долго мучился (нужно было очень) и вот код где-нибудь в начале:
Код

SYSTEMTIME st;
GetSystemTime(&st);
srand(st.wSecond*1000+st.wMilliseconds);

выдаются что ни на есть рандомно! smile
  Вверх
Dubinsky
Дата 5.8.2005, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



специально повторю хелп :

случайные числа должны как то инициализироватся , если нет он выдаёт всегда и везде ОДНУ И ТУ ЖЕ ПОСЛЕДОВАТЕЛЬНОСТЬ СЛУЧАЙНЫХ чисел ! это отладочный режим рандома ! чтобы в программе можно было следить за глюками , если они возникают при определённом случайном числе (ну например выход за пределы списка каким то случайным числом) то если диапазон случайных чисел большой , дождатся следующего глюка при следующем запуске будет трудно (да и глюк будет появлятся в разное время) , а так всё время одинаковый ряд , глюк будет возникать в одно и то же время в одних и тех же условиях.

во время отладки инициализация отрубается (ну там командой препроцессора) а в релизе врубается.

PM MAIL WWW   Вверх
p0s0l
Дата 6.8.2005, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: нет
Всего: 112



Вызывать Randomize в цикле перед каждым Random-ом не нужно, т.к. это портит распределение случайной величины; не известно, какие свойства будут у такого распределения. Ну и во-вторых, не известно как сработает Randomize, т.е. каким способом он получает время ? Таймеры изменяют своё значение в дискретные моменты времени, и если период этот большой, то может получиться так, что последовательный вызов нескольких Randomize выдаст одни и то же значения, а значит, и Random тоже выдаст абсолютно одинаковые числа...
Например, в Delphi реализация Randomize выглядит следующим образом (в Builder скорее всего также): вызывается QueryPerformanceCounter, если результат нулевой, то вызывается GetTickCount. Как видно, есть вероятность того, что будет работать GetTickCount (правда не знаю, в каких случаях не сработает QueryPerformanceCounter), в этом случае мы получим огромное количество одинаковых идущих друг за другом чисел...
Поэтому правильнее 1 раз вызвать Randomize, а потом просто вызывать Random...


--------------------
С уважением, г-н Посол.
PM   Вверх
InfMag
Дата 15.8.2005, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



Да! Да! Народ, я написать забыл. Чтобы о Randomize(); и randomize(); не говорили они не помогают!
Если написать Randomize(); один раз, то числа будут выдаваться случайно, но проблема исходит от того, что обновление хэша времени происходит тока раз в секунду. Я сделал примерчик, тыкаю на кпопку... Вобщем интервал между обновления числа равен ЦЕЛОЙ СЕКУНДЕ!!! А что если операция вызывается перетасовкой через цикл? Юзать таймер на одну секунду и ждать пока програ проделает действия с этим Randomize();?! Просто смех!
Вот как написал я и у меня все идеально работает:
Код

// Объявляю в конструкторе связь со временем
__fastcall TTestReady::TTestReady(TComponent* Owner)
        : TForm(Owner)
{
        srand((unsigned)time(NULL));
}

// Функция случайных чисел
int rnd(int &From, int &To)
{
        return(To-rand()%((To-From)+1));
}

Вот так все работает у меня тик так. Один раз зделал и больше не насиловал Randomize();
А те люди, которые его так и юзали, наверно уже много глючных проектов наделали smile))
Добавлено @ 10:56
Сорри, у меня форма не стандартно называется... smile
Код

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        srand((unsigned)time(NULL));
}

PM   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1410 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.