Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Генераторы случайных чисел 
:(
    Опции темы
Riddik
Дата 24.4.2009, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как создаются ф-ии, генерирующие случайные числа, целые и с плавающей точкой?
PM MAIL   Вверх
InvalidProperty
Дата 24.4.2009, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я полагаю примерно так или, конкретнее, так (ссылки вконце статьи)


--------------------
dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null
dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null
echo $0 >> $0
PM MAIL ICQ Jabber   Вверх
mrbrooks
Дата 24.4.2009, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Riddik, есть хорошая функция rand_s.  Юзать можно к примеру так:
Код

unsigned int myrand()
{
   unsigned int r;
   rand_s(&r);
   return (unsigned int )((double)r/(double)UINT_MAX*50.+1);
}


Функция вернет случайное значения от 1 до 50.
PM MAIL   Вверх
IKM2007
Дата 24.4.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


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

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



mrbrooks, какую библиотеку нужно подключить?

Это сообщение отредактировал(а) IKM2007 - 24.4.2009, 08:44


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
GoldFinch
Дата 24.4.2009, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



стандартные функции-ГПСЧ в С\С++, делфи, и наверное других языках основаны на формуле
  RandSeed=m*RandSeed+b, 
  где RandSeed - переменная хранящая случайное число, 
   разрядность которого совпадает с разрядностью системы 
   (32разряда для 32разрядных систем),
  m и b - некоторые константы (например 0x8088405 и 1 в делфи).

результирующее случайное число, вещественное или целое в заданном диапазоне получается из RandSeed, 

для вещественных чисел в интервале (1;0] - делением RandSeed на его максимально возможное значение, 0xFFFFFFFF для 32разрядных систем

для целых чисел в интервале (a;0] - умножением на а, или нахождением остатка от деления на a (return RandSeed mod a;)
как известно умножение во много раз быстрее деления, поэтому лучше использовать именно умножение:
  return (RandSeed*a)>>32;
  где 32  - разрядность RandSeed.
хотя кроме умножения здесь присутствует сдвиг, в действительности в х86 системах его не будет в силу специфики инструкции mul, подозреваю что во многих других CISC системах тоже

Добавлено через 11 минут и 28 секунд
разумеется надо учитывать, что у полученного вещественного числа энтропия не будет больше энтропии RandSeed, 
так например при 32разрядном RandSeed у полученного из него вещественного 64разрядного числа (double) энтропия будет не больше исходных 32бит на число
PM MAIL ICQ   Вверх
mrbrooks
Дата 24.4.2009, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Цитата(IKM2007 @  24.4.2009,  08:42 Найти цитируемый пост)
mrbrooks, какую библиотеку нужно подключить?

пардон.  smile 

Код

#include <stdlib.h> //or <cstdlib>

PM MAIL   Вверх
Riddik
Дата 24.4.2009, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем спасибоsmile



GoldFinch,  smile  Умножение намного быстрее деления? Т.е. если в моей программе происходит деление много раз в секунду, то лучше заменить умножением, чтобы облегчить жизнь процессору? (тем более что програ должна летать и на слабых машинах, на  стареньких)
Например: сейчас у меня выражение var/6.0f выполняется около 100 раз в секунду. И скорее всего, будет ещё большим скоро. Стоит ли заменить его на var*0.1666f ? 

Это сообщение отредактировал(а) Riddik - 24.4.2009, 09:54
PM MAIL   Вверх
GoldFinch
Дата 24.4.2009, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Riddik, оптимизацией констант должен заниматься компилятор
PM MAIL ICQ   Вверх
Riddik
Дата 24.4.2009, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GoldFinch, т.е. компилятор сам заменить деление умножением и соответственно константу?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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