Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 18.01.2017
Сообщений: 14
1

Генератор XORShift и Метод Фибоначчи с запаздываниями

26.04.2017, 13:06. Показов 5487. Ответов 11

Author24 — интернет-сервис помощи студентам
Вопрос такой,как генерировать вещественные числа в определенном диапазоне [0;1] с помощью XORShift и генератора на основе Метода Фибоначчи с запаздываниями,и возможно ли это ?

Я имею в виду,как этими генераторами пользоваться,чтобы получить вещественное число в нужном мне интервале?В интернете мало информации на русском языке,даются только сами алгоритмы.

Вот например функция rand() стандартной библиотеки С/C++ генерирует числа в диапазоне от 0 до RAND_MAX. И для получения вещественных чисел в определенном диапазоне мне нужно записать

C++
1
double x = (double)rand() / (double)RAND_MAX * ((max) - (min)) + (min)
где min - это начало диапазона,а max - конец,например 0 и 1.

Так вот,как быть с XORShift и генератором Фибоначчи?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.04.2017, 13:06
Ответы с готовыми решениями:

Генератор Фибоначчи
Всем привет! Может кто объяснить как он работает?? классический вид чисел фибоначчи 1 1 2 3 5 8...

Генератор Фибоначчи
Генератор на основе последовательности Фибоначчи: xn+1 = (xn + xn-1) mod m или xn+1 = (xn + xn-k)...

Генератор чисел Фибоначчи
Добрый день. Формулу прикрепил. Число "N" задается с клавиатуры. Подскажите, как найти "k"?

Аддитивный генератор (Фибоначчи с запаздыванием)
Написать программу, генерирующую случайные числа, используя аддитивный генератор чисел. ...

11
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
26.04.2017, 14:22 2
Что такое XORShift?
0
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
26.04.2017, 14:30 3
Цитата Сообщение от vosure Посмотреть сообщение
XORShift и генератора на основе Метода Фибоначчи
В каких интервалах генерируются числа этими генераторами?
0
0 / 0 / 0
Регистрация: 18.01.2017
Сообщений: 14
26.04.2017, 14:50  [ТС] 4
Цитата Сообщение от DemolitionMan Посмотреть сообщение
Что такое XORShift?
Генератор случайных чисел,сделанный на основе операций побитового сдвига.

Цитата Сообщение от Dani Посмотреть сообщение
В каких интервалах генерируются числа этими генераторами?
В том то и дело,что я не знаю,
Цитата Сообщение от vosure Посмотреть сообщение
в интернете мало информации на русском языке,даются только сами алгоритмы
Единственное что могу сказать,числа получаются очень большие,что-то вроде:

39462749392662495
4596835458788324745
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
26.04.2017, 17:26 5
Про XORShift посмотрел, вот, например, статья:http://www.apofig.com/2014/10/random-xorshift.html.
Так, а что тут трудного-то, ну реализуйте готовый алгоритм в C++ да и все, тем более, что готовый код уже есть. Если нужно дробное, то просто поделите на 10 в степени <число знаков> да и все. Я считаю Ваша проблема не такая уж и сложная.
Цитата Сообщение от vosure Посмотреть сообщение
В том то и дело,что я не знаю,
- как это Вы не знаете, если Вы сами сказали, что нужно сгенерировать числа от 0 до 1?
0
0 / 0 / 0
Регистрация: 18.01.2017
Сообщений: 14
26.04.2017, 17:45  [ТС] 6
DemolitionMan,
Не сложная ?Я весь интернет перерыл ничего толкового нет,только сами алгоритмы.
Вопрос в том,как рандомить вещественное число в нужном мне диапазоне,то есть от 0 до 1.
Возвращает он не понятно что,я приводил пример:
Цитата Сообщение от vosure Посмотреть сообщение
39462749392662495
4596835458788324745
Как собственно эти числа преобразовать к чему-то более менее похожему на то,что мне нужно ?
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,706
26.04.2017, 18:08 7
Лучший ответ Сообщение было отмечено vosure как решение

Решение

Так же нормируй по той формуле, только RAND_MAX замени на своё значение.
1
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
26.04.2017, 19:11 8
Цитата Сообщение от vosure Посмотреть сообщение
Как собственно эти числа преобразовать к чему-то более менее похожему на то,что мне нужно?
- я же сказал, нужно сначала посчитать числа, будет код что-то типа этого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int Counter = 0, z;
unsigned int Digit = 2292662495, Bufer;  //Ваше бредовое число
Bufer = Digit;  //Сохраним число для будущих использований, т.к. Digit будет удалено.
double Resultat;
 
do
{
    z = Digit%10;
    Digit /= 10;
    Counter++;
}
while(Digit)  //Повторять, пока Digit != 0.
 
//Теперь в Counter - число цифр, Bufer делим на 10*Counter - получаем то, что нам нужно:
Resultat = Bufer/(10*Counter);
Попробуете так, ладно. Расскажете, что получилось.

По поводу той ссылки что я дал, смотрите, чтобы число в 0 не ушло после вот этой строки:
C++
1
last ^= (last >> 35);  //Тут, наверное, имеется ввиду для 64-битных чисел, если у Вас 32-битное число, то сдвигать, наверное, надо на число поменьше(0-32).
И вообще, попробуйте тот код, может заработает.
0
0 / 0 / 0
Регистрация: 18.01.2017
Сообщений: 14
26.04.2017, 19:17  [ТС] 9
nmcf, Спасибо,все работает.Я не знал диапазон рандома XORShift,но разобрался с 0 до 0xFFFFFFFF.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static unsigned int XORShift() {
    unsigned int t = x ^ (x << 11);
    x = y; y = z; z = w;
    return w = w ^ (w >> 19) ^ t ^ (t >> 8);
}
 
int main()
{
    const int N = 100;
    long double* Array = new long double[N];
    for (int i = 0;i < N; i++)
    {
        long double x = (long double)XORShift() / (long double)4294967295 * ((1) - (0)) + (0);
            Array[i] = x;
        cout << Array[i] << endl;
 
       }
Как-то так выглядят конечные варианты.
А может кто с диапазоном фибоначчиевского алгоритма подсказать ?
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
26.04.2017, 20:16 10
Подсказывать Вам дело неблагодарное, тем более, что Интренет полон тем, что Вы ищете.
0
0 / 0 / 0
Регистрация: 18.01.2017
Сообщений: 14
26.04.2017, 20:29  [ТС] 11
DemolitionMan,
Цитата Сообщение от DemolitionMan Посмотреть сообщение
Подсказывать Вам дело неблагодарное
Почему же ?
Спасибо вам за помощь,но вы говорили немного не о том.Ваше предложение было в том,чтобы взять эти непонятные числа и просто разделить на 10 в нужной степени,но ведь мне нужно войти в диапазон,да и плюс ко всему там деление совсем ни к чему.
Помог вариант вот этого товарища:
Цитата Сообщение от nmcf Посмотреть сообщение
Так же нормируй по той формуле, только RAND_MAX замени на своё значение.
Все получилось.
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
27.04.2017, 06:04 12
Я не понимаю как это могло получиться, если, как я знаю, rand() генерирует от 0 до RAND_MAX = 32678(ну или что-то такое, непомню точно, а смотреть лень, в общем Вы поняли), если это число не заменять, а оставить RAND_MAX, то будет генерироваться, то что Вы хотите: от 0 до 1. Если же это число заменить на очень большое(Ваше бредовое число), то будет генерироваться, скажем от 0 до 0.1, что естественно, неправильно. Как у Вас могло получиться, я не понимаю.
Цитата Сообщение от vosure Посмотреть сообщение
Я имею в виду,как этими генераторами пользоваться,чтобы получить вещественное число в нужном мне интервале?В интернете мало информации на русском языке,даются только сами алгоритмы.
Насчет Фиббоначиевого метода с задержкой я был прав. В Интренете полно информации и вчера еще такой хороший сайт нашел, где все так хорошо и понятно объясняется, ну красота вобщем. Так что читайте Интернет и не говорите больше, что там ничего нет.
0
27.04.2017, 06:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.04.2017, 06:04
Помогаю со студенческими работами здесь

генератор ПСП по методу Фибоначчи
Нужно реализовать генератор ПСП по методу Фибоначчи, используя полином 9D (16) = 1001 1101 (2) ...

Генератор случайных чисел методом Фибоначчи
Всем доброе время суток...) Я понимаю етот вопрос был выведен на показ уж много раз в подобныж...

ГСПЧ с использованием XORshift
Доброго времени суток, помогите, сессия горит, нужно написать генератор случайных чисел на 8086 на...

Метод оптимизации. Метод Фибоначчи
Дан отрезок минимизации и точность минимизации Е=0.01. Помогите пожалуйста решить данную задачу....

Метод Фибоначчи
Прошу помочь в программировании с использованием чисел Фибоначчи: Используется ли он только при...

Метод Фибоначчи
Помогите решить проблему с методом Фибоначчи. При вычислении пишет &quot;Значение должно быть вектором.&quot;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru