Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
aleksandr_t94
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 100
#1

Сгенерировать число "1" или "2" - C++

21.02.2013, 18:13. Просмотров 1240. Ответов 10
Метки нет (Все метки)

Как сделать с помощью функции rand генерацию числа в диапазоне от 0 до 1? Просто если пишу rand() % 1 то всё время выдаёт только одно и тоже число. Как мне известно малые биты менее случайны чем старшие. Как решить проблему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2013, 18:13     Сгенерировать число "1" или "2"
Посмотрите здесь:

C++ Дано трехзначное число. Проверить истинность высказывания: "Цыфры даного числа образуют возрастающую или убывающую последовательность"."
C++ Вывести "Молодой" или "Старый" в зависимости от введенного возраста
Game "Угадай число" как зделать запрет на "букви" ???? C++
Определить, каких букв в тексте больше: "м" или "н" C++
C++ Проверить, есть ли в слове приставка "пре" или "пре".
"И" ведет себя как "ИЛИ" C++
C++ Дано целое число , лежащие в диапазоне от -999 до 999.Вывести строку - словесного описание данного числа вида "отрицательное двухзначное число", "отри
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4253 / 2785 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
21.02.2013, 18:19     Сгенерировать число "1" или "2" #2
Цитата Сообщение от aleksandr_t94 Посмотреть сообщение
Как мне известно малые биты менее случайны чем старшие.
WTF?

Цитата Сообщение от aleksandr_t94 Посмотреть сообщение
Как решить проблему?
C++
1
int n = 1.0 * rand() / RAND_MAX;
Добавлено через 2 минуты
Как это понимать?
Цитата Сообщение от aleksandr_t94 Посмотреть сообщение
Сгенерировать число "1" или "2"
Цитата Сообщение от aleksandr_t94 Посмотреть сообщение
числа в диапазоне от 0 до 1?
пример выше генерит числа от 0 до 1.
aleksandr_t94
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 100
21.02.2013, 18:23  [ТС]     Сгенерировать число "1" или "2" #3
Цитата Сообщение от Kastaneda Посмотреть сообщение
WTF?


C++
1
int n = 1.0 * rand() / RAND_MAX;
Добавлено через 2 минуты
Как это понимать?


пример выше генерит числа от 0 до 1.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <time.h>
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    srand (time(NULL));
    int n = 1.0 * rand() / RAND_MAX;
    srand (time(NULL));
    printf("%d\n", n);
    
    getchar();
    return 1;
}
Всегда выводит 0.

На счёт WTF. На сколько мне известно, функция rand() это тот же самый ЛКГ(линейный конгруэнтный генератор). Соответственно ЛКГ==rand() как бы. Младшие биты менее случайны чем старшие биты получается. Даже судя из примера, выдаёт-то всегда 0 =)
StormSpirit
 Аватар для StormSpirit
6 / 6 / 2
Регистрация: 13.02.2013
Сообщений: 32
21.02.2013, 18:26     Сгенерировать число "1" или "2" #4
попробуй
C++
1
rand_value = rand() % 2;
Это позволит сгенерировать "0" или "1", а там 1 добавишь.

Кликните здесь для просмотра всего текста
P.S. когда ты делишь на 1, остаток всегда будет равен 0.
KostyaKulakov
Заблокирован
21.02.2013, 18:28     Сгенерировать число "1" или "2" #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <time.h>
 
int main()
{
    srand(time(NULL));
 
    time_t rand_num = rand() % 2;
 
    std::cout << rand_num << std::endl;
 
    getchar();
 
    return 0;
}
Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4253 / 2785 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
21.02.2013, 18:28     Сгенерировать число "1" или "2" #6
Цитата Сообщение от aleksandr_t94 Посмотреть сообщение
printf("%d\n", n);
нужно так
C++
1
printf("%lf\n", n);
в rand() равномерное распределение чисел по всему диапазону, т.е. нет такого, что бОльшие числа генерятся чаще меньших.
mrmaster88
42 / 42 / 3
Регистрация: 13.04.2012
Сообщений: 112
21.02.2013, 18:29     Сгенерировать число "1" или "2" #7
Цитата Сообщение от aleksandr_t94 Посмотреть сообщение
Как мне известно малые биты менее случайны чем старшие
генератор случайных чисел на самом деле генератор псевдослучайный(читайте документацию)

случайности иногда псевдослучайны)))
KostyaKulakov
Заблокирован
21.02.2013, 18:29     Сгенерировать число "1" или "2" #8
Цитата Сообщение от StormSpirit Посмотреть сообщение
попробуй
C++
1
rand_value = rand() % 2;
Это позволит сгенерировать "0" или "1", а там 1 добавишь.

Кликните здесь для просмотра всего текста
P.S. когда ты делишь на 1, остаток всегда будет равен 0.
опередил чутка
aleksandr_t94
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 100
21.02.2013, 18:39  [ТС]     Сгенерировать число "1" или "2" #9
Всем спасибо, вопрос решил =)
Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4253 / 2785 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
21.02.2013, 18:44     Сгенерировать число "1" или "2" #10
Цитата Сообщение от aleksandr_t94 Посмотреть сообщение
На сколько мне известно, функция rand() это тот же самый ЛКГ(линейный конгруэнтный генератор). Соответственно ЛКГ==rand() как бы. Младшие биты менее случайны чем старшие биты получается.
Да, ты прав. rand() это ЛКГ, но в ЛГК заморочка с младшими битами в том (если верить википедии), что они менее случайны, чем старшие, поэтому в качестве результата rand() выдаются 16-30 биты, т.е. младшие биты в формировании результата не учавствуют.
Поэтому все таки думаю нельзя сказать, что rand() == ЛГК.

Добавлено через 3 минуты
Цитата Сообщение от Kastaneda Посмотреть сообщение
в rand() равномерное распределение чисел по всему диапазону, т.е. нет такого, что бОльшие числа генерятся чаще меньших.
в подтверждение слов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <ctime>
#include <cstdlib>
 
int main()
{
    srand(time(NULL));
    int arr[10] = {0};
 
    for (int i = 0; i < 1000000; i++) {
        arr[rand() % 10]++;
    }
 
    for (int i = 0; i < 10; i++) {
        std::cout << arr[i] << std::endl;
    }
 
    return 0;
}
вывод
Bash
1
2
3
4
5
6
7
8
9
10
99663
99982
100004
100366
99977
100098
99852
99951
100323
99784
как видим числа более - менее равномерно распределились по всему диапазону.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2013, 20:48     Сгенерировать число "1" или "2"
Еще ссылки по теме:

"Точность вычислений" или "Элементарная погрешность" C++
Что применить "\n" или "endl"? C++
ткните мордой плз на описание конструкций типа defect?"brak":"goden" C++
C++ Дано натуральное число. Верно ли, что цифра "a" встречается в нем реже, чем цифра "b"?
"Чудеса типа float" или "Куда девалась информация?" C++

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

Или воспользуйтесь поиском по форуму:
coss1
1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 14
21.02.2013, 20:48     Сгенерировать число "1" или "2" #11
Цитата Сообщение от aleksandr_t94 Посмотреть сообщение
Как сделать с помощью функции rand генерацию числа в диапазоне от 0 до 1? Просто если пишу rand() % 1 то всё время выдаёт только одно и тоже число. Как мне известно малые биты менее случайны чем старшие. Как решить проблему?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <ctime>
 
int main ()
{
    const int size = 5;
    int array[10];
    for (int i = 0; i < size; i++) {
        array[i] = rand()%2;
        std::cout << array[i] << std::endl;
    }
    system("pause");
    return 0;
}
Yandex
Объявления
21.02.2013, 20:48     Сгенерировать число "1" или "2"
Ответ Создать тему
Опции темы

Текущее время: 11:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru