Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сгенерировать число любой длины в заданном диапазо 
:(
    Опции темы
xvr
Дата 13.4.2011, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(borisbn @  13.4.2011,  08:10 Найти цитируемый пост)
неа. не будет. (0...1000000). надо что-то другое думать. 

Угу. Остается только арифметика больших чисел  smile Нужно как минимум сделать операцию (a+b)/2 (над строками)
Код

String rnd(String MinV, String MaxV)
{
 String MidV;
 while(MinV!=MaxV)
  {
   MidV=AddDiv2(MinV,MaxV); // MidV=(MaxV+MinV)/2
   if (MidV==MinV) return rnd()&1?MinV:MaxV;
   (rnd()&1?MinV:MaxV)=MidV;
  }
 return MinV;
}

Идея - на каждой итерации вычисляем среднее между минимумом и максимумом и выбираем (случайно) для дальнейшей генерации диапазон минимум-среднее или среднее-максимум
Недостаток - будет долго работать (log2(Max-Min) итераций)

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


Бывалый
*


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

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



Извиняюсь за свое отсутствие, почитал ваши ответы, так и не понял в конечном счете что мне делать

Если символьное представление не годиться, то что тогда можно сделать?

Я нашел инфу, что целые числа большой длины можно представить в виде массива, каждая ячейка которого хранит кусочек этого большого числа.

Но тогда как быть с вещественными числами

Это сообщение отредактировал(а) Alexey91 - 17.4.2011, 11:59
PM   Вверх
borisbn
Дата 17.4.2011, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



здесь kemiisto дал три ссылки на библиотеки с арифметикой больших чисел. посмотри их. может, хоть и не заюзаешь, но будет понятно, как и что сделано...

Цитата(Alexey91 @  17.4.2011,  11:53 Найти цитируемый пост)
Если символьное представление не годиться, то что тогда можно сделать?

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


Цитата(Alexey91 @  17.4.2011,  11:53 Найти цитируемый пост)
Но тогда как быть с вещественными числами, и с тем, что часть числа может начинаться с '0'

не вижу проблемы ни с вещественными числами, ни с тем, что для удобства и простоты алгоритмов можно начинать число с '0'


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Alexey91
Дата 17.4.2011, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Хорошо, посмотрю GMP
Только как ее поставить на Windows????




Это сообщение отредактировал(а) Alexey91 - 17.4.2011, 13:50
PM   Вверх
borisbn
Дата 17.4.2011, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



вот ф-ция деления на 2
Код

std::string str_div_2( const std::string & a )
{
    std::string result;
    int a_length = a.length();
    int fromPrev = 0;
    for ( int i = 0; i < a_length; ++i )
    {
        int digit = a[ i ] - '0' + fromPrev;
        result = result + (char)( ( digit / 2 ) + '0' );
        fromPrev = ( digit % 2 ) * 10;
    }
    int i = 0;
    while ( result[ i ] == '0' )
    {
        i++;
    }
    return result.substr( i, result.length() );
}

объёдени мою str_add с этой и вставь их в алгоритм, предложенный xvr. 
Цитата(xvr @  13.4.2011,  08:28 Найти цитируемый пост)

Нужно как минимум сделать операцию (a+b)/2 (над строками)
String rnd(String MinV, String MaxV)
{
   String MidV;
   while(MinV!=MaxV)
   {
        MidV=AddDiv2(MinV,MaxV); // MidV=(MaxV+MinV)/2
        if (MidV==MinV) return rnd()&1?MinV:MaxV;   
        (rnd()&1?MinV:MaxV)=MidV;
   }
   return MinV;
}
Идея - на каждой итерации вычисляем среднее между минимумом и максимумом и выбираем (случайно) для дальнейшей генерации диапазон минимум-среднее или среднее-максимумНедостаток - будет долго работать (log2(Max-Min) итераций)

Я так сделал, проверил - работает.



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 17.4.2011, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(xvr @  13.4.2011,  08:28 Найти цитируемый пост)
String rnd(String MinV, String MaxV)
{
 String MidV;
 while(MinV!=MaxV)
  {
   MidV=AddDiv2(MinV,MaxV); // MidV=(MaxV+MinV)/2
   if (MidV==MinV) return rnd()&1?MinV:MaxV;
   (rnd()&1?MinV:MaxV)=MidV;
  }
 return MinV;
}


возьмем простой пример. будем генерить числа в диапазоне 1..3

вероятность выпадения:
1 - 25%
2 - 50%
3 - 25%

По настоящему равномерно распределенный ГСЧ (uniform random) не получится, ребята.



PM MAIL   Вверх
xvr
Дата 18.4.2011, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(volatile @  17.4.2011,  23:33 Найти цитируемый пост)
По настоящему равномерно распределенный ГСЧ (uniform random) не получится, ребята.

Ну если надо и для таких чисел тоже, то можно слегка модифицировать выбор половин (в моем алгоритме). Можно выбирать их не равновероятно, а пропорционально их размеру (что имеет смысл когда диапазон сойдется до нескольких цифр. Кстати, в этом случае вообще можно отконвертить разность в банальный int и сделать выбор сразу по нему всему, обычным rnd)

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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