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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Генератор случайных чисел для больших числел 
V
    Опции темы
Splendid
Дата 1.7.2008, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

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



Нашла несколько тем по ГСЧ, но мне нужен довольно большой диапазон, числа должны генерироваться от 1 и до некоторого большого числа, которое м.б. до ((2 в степени 32768)-1).
Подскажите, пожалуйста, как в этом случае организовать ГСЧ??

Большие числа представляются как:

Код

typedef struct{ 
    long int len;
    long int sign;
    unsigned short int num[2048]; 
} big_number;


PM MAIL   Вверх
Alek86
Дата 1.7.2008, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



1 поменять стуртуру на такую

Код
typedef struct {
    enum {MaxCount = 2048};
    typedef unsigned short int Figure;
    long int len;
    long int sign;
    Figure num[MaxCount]; 
} big_number;


2 добавить функцию

Код
GetRandom(big_number& o_number) {
 for (int i = 0; i < big_number.MaxCount; ++i ) {
  // думаю, вероятность подстановки любого числа тут одинакова
  o_number.num[i] = static_cast<big_number.Figure>(rand());
 }
 o_number.sign = rand() % 2; // зачем тебе для хранения була целый инт?
 SetLenByData(o_number); // это вызывается ф-я, которая по данным считает длину
}


если структуру поменять нельзя, то замени в тексте MaxCount и Figure на соотв.
реализовать SetLenByData попробуй сама.

Добавлено через 39 секунд
а. и еще одно
язык у тебя с++ или с?


--------------------
user posted image    user posted image
PM MAIL   Вверх
Splendid
Дата 1.7.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

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



язык с, структуру менять нельзя....пока ничего не поняла, можно поподробнее?
PM MAIL   Вверх
Alek86
Дата 1.7.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Splendid @  1.7.2008,  13:56 Найти цитируемый пост)
пока ничего не поняла, можно поподробнее?

по циклу заполняешь массив num рендомными числами
потом рендомно ставить знак
потом считаешь длину числа


--------------------
user posted image    user posted image
PM MAIL   Вверх
Splendid
Дата 1.7.2008, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

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



сейчас переварю...

Это сообщение отредактировал(а) Splendid - 1.7.2008, 14:10
PM MAIL   Вверх
Lazin
Дата 1.7.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Splendid @  1.7.2008,  14:09 Найти цитируемый пост)
- что вот это значит?

это значит (unsigned short) - приведение типа
PM MAIL Skype GTalk   Вверх
Splendid
Дата 1.7.2008, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

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



Код

GetRandom(big_number& o_number) {
 for (int i = 0; i < big_number.MaxCount; ++i ) {
  // думаю, вероятность подстановки любого числа тут одинакова
  o_number.num[i] = static_cast<big_number.Figure>(rand());
 }
 o_number.sign = rand() % 2; // зачем тебе для хранения була целый инт?
 SetLenByData(o_number); // это вызывается ф-я, которая по данным считает длину
}



а что такое - o_number, num?

Я так понимаю, что Figure надо заменить на num[2048], а MaxCount на sizeof(num)?

SetLenByData я реализую сама, помогите цикл переписать, пожалуйста...

Добавлено через 4 минуты и 50 секунд
и еще - выходом здесь будет массив сл.чисел?
PM MAIL   Вверх
Alek86
Дата 1.7.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Figure - это тип элемента массива

Добавлено через 1 минуту и 6 секунд
а, ну да, если си, то static_cast нельзя
нужно использовать форму, указанную Lazin

Добавлено через 6 минут и 13 секунд
Цитата(Splendid @  1.7.2008,  14:18 Найти цитируемый пост)
а что такое - o_number, num?

опять же, это си
потому функция должна принимать указатель, а не ссылку
Код
void GetRandom(big_number* op_number) {


Цитата(Splendid @  1.7.2008,  14:18 Найти цитируемый пост)
и еще - выходом здесь будет массив сл.чисел?

нет
ты отдаешь указатель на экземпляр big_number, а функция его заполняет


--------------------
user posted image    user posted image
PM MAIL   Вверх
Splendid
Дата 1.7.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

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



блин, я ничего понять не могу...зачем массив? мне нужно одно случайное число >1 и меньше заданного большого числа...



Это сообщение отредактировал(а) Splendid - 1.7.2008, 14:35
PM MAIL   Вверх
Alek86
Дата 1.7.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Splendid @  1.7.2008,  14:34 Найти цитируемый пост)
мне нужно одно случайное число >1 и меньше заданного большого числа...

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


--------------------
user posted image    user posted image
PM MAIL   Вверх
Splendid
Дата 1.7.2008, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

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



правильно ли я поняла: 
o_number - заданное большое число, полученное случайное число не д.б больше его.
вместо static_cast пишем просто (unsigned short)

o_number.sign = rand() % 2;  - т.к. у меня число больше единицы д.б. то это не надо?

Добавлено через 45 секунд
какие есть операции над большими числами?  - сложение, умножение, вычитание, сравнение, деление
PM MAIL   Вверх
bsa
Дата 1.7.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Splendid, генератор псевдослучайных чисел реализуется по формуле: result[i] = (result[i-1] * primeNum + oddNum) / divisor,
где result - это массив генерируемых случайных чисел, primeNum - некое постоянное простое число (больше, чем максимально получаемый результат), oddNum - некое постоянное нечетное число, divisor - некий постоянный делитель (обычно, он просто отделяет старшую половину разрядов числа).

Это сообщение отредактировал(а) bsa - 1.7.2008, 15:05
PM   Вверх
Splendid
Дата 1.7.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

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



bsa,  а primeNum, oddNum, divisor в принципе можно произвольными взять?
PM MAIL   Вверх
bsa
Дата 1.7.2008, 15:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(Splendid @ 1.7.2008,  15:12)
bsa,  а primeNum, oddNum, divisor в принципе можно произвольными взять?

главное чтобы primeNum было простым (если забыла, то читай определение) и большим, oddNum - нечетным, а divisor подходящим.
Например немного переработанный вариант из glibc:
Код
int rand_r(unsigned int *seed)
{
  unsigned int next = *seed;
  int result;

  next = next * 1103515245 + 345;
  result = (unsigned int) (next / 65536) % 2048;

  next = next * 1103515245 + 345;
  result <<= 10; //умножение на 2 в 10-й степени (1024)
  result ^= (unsigned int) (next / 65536) % 1024;

  next = next * 1103515245 + 345;
  result <<= 10;
  result ^= (unsigned int) (next / 65536) % 1024;

  *seed = next;

  return result;
}

PM   Вверх
Splendid
Дата 1.7.2008, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

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



bsa, спасибо!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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