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

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

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

C++ Дан текст, хранящийся в текстовом файле f, каждый символ которого может быть малой буквой, цифрой или одним из знаков "+", "-", "*".
Необработанное исключение в "0x00414558" в "467.exe": 0xC0000005: Нарушение прав доступа при чтении "0xabababbb" C++
Написать программу, которая запрашивает у пользователя номер дня недели и выводит одно из сообщений: "Рабочий день","Суббота" или "Воскресенье" C++
C++ Необработанное исключение в "0x01082855" в "sort.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc"
Необработанное исключение в "0x778e15de" в "dir-3.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000000" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 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
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 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
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 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++ Необработанное исключение в "0x013f2b22" в "123.exe": 0xC0000005: Нарушение прав доступа при записи "0xfdfdfdfd"
C++ С++ консольное приложение win32, матерится на первое "pow" после "if", а на "system" говорит что неопределён.
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"
Ответ Создать тему
Опции темы

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