Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
goto_
0 / 0 / 0
Регистрация: 08.09.2015
Сообщений: 18
#1

Как сделать, чтобы числа были разные?

08.09.2015, 16:52. Просмотров 510. Ответов 14
Метки нет (Все метки)

Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <stdlib.h>
#include <time.h>
 
using namespace std;
 
int rolldice (void);
 
int main()
{
    setlocale (LC_ALL, "RUS");
 
    enum Status { CONTINUE, WON, LOST};
    Status gameStatus;
    int sum, counter = 0;
    while (counter != 10)
    {
 
 
    srand(time(NULL));
    sum = rolldice();
 
    cout << "Я загадал число от 1 до 1000, вы можете его угадать!" << endl
         << "Пожалуйста, напечатайте вашу первую догадку" << endl;
    cout << sum << endl;
    counter++;
    }
    return 0;
}
 
int rolldice (void)
{
    int a1;
    a1 = 1 + rand() % 999;
    return a1;
    }
Добавил цикл while чтобы удостовериться в том, что числа каждый раз разные. А по факту получается, что если программу запускать несколько раз, то числа разные. Если через цикл - то числа одинаковые. Есть догадка, что это связано с этой строкой:
C++
1
srand(time(NULL));
ведь программа запускается и выполняется в один момент времени. Это так?
Если да, то как через цикл сделать много выводов программы с постоянно разными рандомными числами? А если нет, то в чём тогда причина?

Добавлено через 1 минуту
строчки cout там не при чем, просто забыл их заслэшить))) не обращайте внимания!

Добавлено через 34 секунды
enum и gamestatus тоже)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2015, 16:52
Ответы с готовыми решениями:

Файл: Как сделать так, чтобы числа в файл были прописаны не рандомно?
Здраствуйте, дан код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Как сделать так, чтобы функции были не вложенными?
получается так, что сначала у меня идет функция int main(), потом int sum, и...

Как сделать, чтобы при выводе на экран были пробелы
#include &lt;iostream&gt; using namespace std; int main() { int sum = 0, val =...

Как сделать ,чтобы строки двумерного массива были кратные двум?
Как сделать ,чтобы строки двумерного массива были кратные двум?То есть когда я...

Даны натуральные числа M, N. Поменять одну из цифр первого числа с цифрой второго числа, чтобы получившиеся числа были взаимно простыми
Даны натуральные числа M, N. Поменять одну из цифр первого числа с цифрой...

14
Renji
2102 / 1543 / 470
Регистрация: 05.06.2014
Сообщений: 4,473
08.09.2015, 17:02 #2
Грубо и на пальцах - srand выбирает одну из (конечных) последовательностей псевдослучайных чисел, а rand эту последовательность потом читает. Вернее, под капотом последовательность генерируется налету, но да не суть. Вы постоянно дергаете srand, поэтому последовательность постоянно запускается сначала. Причем, одна и та же. Поэтому, вам нужно один раз вызвать srand, а потом сколько угодно раз вызывать rand.
1
Operok
177 / 175 / 66
Регистрация: 15.02.2015
Сообщений: 505
Завершенные тесты: 2
08.09.2015, 17:03 #3
Цитата Сообщение от goto_ Посмотреть сообщение
Есть догадка, что это связано с этой строкой:
C++
1
srand(time(NULL));
тогда не используй его, или не передавай в него одно и тоже значение, если хочешь получить разный результат вызова rand()
1
goto_
0 / 0 / 0
Регистрация: 08.09.2015
Сообщений: 18
08.09.2015, 17:08  [ТС] #4
спасибо!
вынес srand за пределы цикла, проблема решилась. Operok, а как еще по быстрому сгенерировать число без rand? выдумывать свой алгоритм???
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
08.09.2015, 17:10 #5
Цитата Сообщение от Renji Посмотреть сообщение
Вы постоянно дергаете srand, поэтому последовательность постоянно запускается сначала. Причем, одна и та же.
поправлю, она будет постоянна в течении 1 секунды, т.е srand инициализируется в зависимости от времени ф-цией time которая раз в секунду будет возвращать разные значения)
0
Operok
177 / 175 / 66
Регистрация: 15.02.2015
Сообщений: 505
Завершенные тесты: 2
08.09.2015, 17:16 #6
goto_, Не так выразился. Просто многократное использование srand позволяет в двух точках программы генерировать одинаковые "случайные" числа, логично что не надо его использовать внутри цикла в контексте вашей задачи.
0
Renji
2102 / 1543 / 470
Регистрация: 05.06.2014
Сообщений: 4,473
08.09.2015, 17:17 #7
Цитата Сообщение от goto_ Посмотреть сообщение
вынес srand за пределы цикла, проблема решилась. Operok, а как еще по быстрому сгенерировать число без rand? выдумывать свой алгоритм???
Выдумывать свой алгоритм, это, по хорошему, много матана. Ибо, во-первых, нужно показать что этот алгоритм не может выродиться в последовательности типа "100, 500, 100, 500, 100...". Во-вторых, надо показать что последовательность будет иметь правильное распределение (не будет перекоса в сторону 100 или 500). Но есть, в принципе, очень простой и быстрый способ все это обойти - вбить в программу готовую таблицу случайных чисел. А таблицу создать кидая кубик до "пока не надоест". Впрочем, они и готовые в сети есть.
0
goto_
0 / 0 / 0
Регистрация: 08.09.2015
Сообщений: 18
08.09.2015, 17:20  [ТС] #8
спасибо!
не буду создавать новую тему, спрошу тут же. код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//программа предлагает пользователю угадать число
//Переменные: загаданное число, число пользователя, игровой статус
#include <iostream>
#include <stdlib.h>
#include <time.h>
 
using namespace std;
 
int rolldice (void);
 
int main()
{
    setlocale (LC_ALL, "RUS");
 
    enum Status { CONTINUE, WON, LOST};
    Status gameStatus;
    int sum, chisloPolzov;
//    int counter = 0;
    srand(time(NULL));
 
 
//    while (counter != 10)
//    {
    sum = rolldice();
 
    cout << "Я загадал число от 1 до 1000, вы можете его угадать!" << endl
         << "Пожалуйста, напечатайте вашу первую догадку" << endl;
    cout << sum << endl;
    cin >> chisloPolzov >> endl;
 
    if (sum == chisloPolzov)
    {
        gameStatus = WON;
        cout << "Вы победили!" << endl;
    }
 
    else
    {
        cout << "Вы проиграли!" << endl;
    }
//    counter++;
//    }
    return 0;
}
 
int rolldice (void)
{
    int a1;
    a1 = 1 + rand() % 999;
    return a1;
    }
компилятор уверен что в этой строчке ошибка:
C++
1
    cin >> chisloPolzov >> endl;
переменная объявлена. сделано это ДО. и на первый взгляд всё верно, но не компилирует. почему?
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
08.09.2015, 17:30 #9
не надо в endl пытаться что то писать) т.е
C++
1
cin >> chisloPolzov;
1
goto_
0 / 0 / 0
Регистрация: 08.09.2015
Сообщений: 18
08.09.2015, 17:33  [ТС] #10
aLarman, странно. а что такого в переносе курсора на новую строку?
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
08.09.2015, 17:35 #11
странного там вот что, endl некая константа,
C++
1
cin>>endl
попытка её модифицировать,
C++
1
cout<<endl
- то что Вы желаете - перенос строки
0
goto_
0 / 0 / 0
Регистрация: 08.09.2015
Сообщений: 18
08.09.2015, 18:11  [ТС] #12
aLarman, а как в одну строчку записать проверку двух условий, если выполнено первое, то вывести на экран одну надпись, если выполнено второе условие, то вывести другую надпись? я помню if и else, но помню что еще вроде был вариант попроще в одну строчку через ?: вроде....или нет....но точно в строчку и проще))
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
08.09.2015, 18:13 #13
C++
1
cout << (condition? "Success":"Fail")<<endl
м.б так
0
goto_
0 / 0 / 0
Регистрация: 08.09.2015
Сообщений: 18
08.09.2015, 18:21  [ТС] #14
где condition ставится условие?
я хочу сократить эту структуру как можно более оптимально
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
while (gameStatus == CONTINUE)
        {
            if (chisloPolzov > sum)
            {
                gameStatus = CONTINUE;
                cout << "Ваше число больше моего. Введите вашу очередную догадку:" << endl;
                cin >> chisloPolzov;
            }
            if (chisloPolzov < sum)
            {
                gameStatus = CONTINUE;
                cout << "Ваше число меньше моего. Введите вашу очередную догадку:" << endl;
                cin >> chisloPolzov;
            }
            else if (chisloPolzov == sum)
            {
                gameStatus = WON;
                cout << "Вы победили!!!" << endl;
            }
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
08.09.2015, 18:23 #15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
while (gameStatus == CONTINUE)
        {
            if (chisloPolzov !=  sum)
            {
                gameStatus = CONTINUE;
                cout << "Ваше число " << (chisloPolzov>num?"больше":"меньше") << " моего. Введите вашу очередную догадку:" << endl;
                cin >> chisloPolzov;
            }
            else
            {
                gameStatus = WON;
                cout << "Вы победили!!!" << endl;
            }
1
08.09.2015, 18:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2015, 18:23

Поменять одну из цифр первого числа с цифрой второго числа, чтобы получившиеся числа были взаимно простыми
Даны натуральные числа M, N. Поменять одну из цифр первого числа с цифрой...

Подскажите как сделать покупку билетов чтобы добавлялись в разные залы
Вобщем есть Класс зал. В нем матрица (типо зал кинотеатра). Есть список фильмов...

Как сделать так, чтобы функция rand() возвращала разные значения
Добрый вечер, как можно в visual studio в цикле каждый раз задавать новые...


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

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

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