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

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

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

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

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

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

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно". Я так...

Вставить пробел после каждого символа "." "," "!" или "?", если за этими символами не следует пробел - C++
Вставить пробел после каждого символа "." "," "!" или "?", если за этими символами не следует пробел (т. е. следует любой символ, кроме...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Двусвязный список с объектом трех типов: "целое число", "вещественное число", "строка" - C++
Есть проблема. Реализовать двухсвязный список. Каждый элемент списка может содержать один объект. Объект может быть трех типов: "целое...

Перегрузка функций "ввести в поток", "вывести с потока", "умножить вектор на число" - C++
Подскажите пожалуйста, как убрать ошибки с этой программы? (делала перегрузку "ввести в поток" и "вывести с потока", а также "умножить...

Вывести на экран монитора число с наименованием "год","года", "лет" - C++
Прошу прогу в С++. Дано натуральное число n (n<=100), определяющее в годах возраст человека. Составить программу, по которой на экран...

10
Kastaneda
Нарушитель
Эксперт С++
4676 / 2880 / 234
Регистрация: 12.12.2009
Сообщений: 7,315
Записей в блоге: 2
Завершенные тесты: 1
21.02.2013, 18:19 #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.
0
aleksandr_t94
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 100
21.02.2013, 18:23  [ТС] #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 =)
0
StormSpirit
6 / 6 / 2
Регистрация: 13.02.2013
Сообщений: 32
21.02.2013, 18:26 #4
попробуй
C++
1
rand_value = rand() % 2;
Это позволит сгенерировать "0" или "1", а там 1 добавишь.

Кликните здесь для просмотра всего текста
P.S. когда ты делишь на 1, остаток всегда будет равен 0.
0
KostyaKulakov
Заблокирован
21.02.2013, 18:28 #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;
}
0
Kastaneda
Нарушитель
Эксперт С++
4676 / 2880 / 234
Регистрация: 12.12.2009
Сообщений: 7,315
Записей в блоге: 2
Завершенные тесты: 1
21.02.2013, 18:28 #6
Цитата Сообщение от aleksandr_t94 Посмотреть сообщение
printf("%d\n", n);
нужно так
C++
1
printf("%lf\n", n);
в rand() равномерное распределение чисел по всему диапазону, т.е. нет такого, что бОльшие числа генерятся чаще меньших.
1
mrmaster88
42 / 42 / 3
Регистрация: 13.04.2012
Сообщений: 112
21.02.2013, 18:29 #7
Цитата Сообщение от aleksandr_t94 Посмотреть сообщение
Как мне известно малые биты менее случайны чем старшие
генератор случайных чисел на самом деле генератор псевдослучайный(читайте документацию)

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

Кликните здесь для просмотра всего текста
P.S. когда ты делишь на 1, остаток всегда будет равен 0.
опередил чутка
1
aleksandr_t94
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 100
21.02.2013, 18:39  [ТС] #9
Всем спасибо, вопрос решил =)
0
Kastaneda
Нарушитель
Эксперт С++
4676 / 2880 / 234
Регистрация: 12.12.2009
Сообщений: 7,315
Записей в блоге: 2
Завершенные тесты: 1
21.02.2013, 18:44 #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
как видим числа более - менее равномерно распределились по всему диапазону.
0
coss1
1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 14
21.02.2013, 20:48 #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;
}
0
21.02.2013, 20:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2013, 20:48
Привет! Вот еще темы с ответами:

Дан текст, хранящийся в текстовом файле f, каждый символ которого может быть малой буквой, цифрой или одним из знаков "+", "-", "*". - C++
Дан текст, хранящийся в текстовом файле f, каждый символ которого может быть малой буквой, цифрой или одним из знаков &quot;+&quot;, &quot;-&quot;, &quot;*&quot;. Групой...

Написать программу, которая запрашивает у пользователя номер дня недели и выводит одно из сообщений: "Рабочий день","Суббота" или "Воскресенье" - C++
Написать программу, которая запрашивает у пользователя номер дня недели и выводит одно из сообщений: &quot;Рабочий день&quot;,&quot;Суббота&quot; или...

Определить, какая из точек "В" или "С" расположены ближе к точке "А". - C++
На оси Ох расположены 3 точки А, В и С. Определить, какая из точек &quot;В&quot; или &quot;С&quot; расположены ближе к точке &quot;А&quot;. Предусмотреть вариант...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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