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

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

Войти
Регистрация
Восстановить пароль
 
goto_
0 / 0 / 0
Регистрация: 08.09.2015
Сообщений: 18
#1

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

08.09.2015, 16:52. Просмотров 485. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как сделать, чтобы числа были разные? (C++):

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

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

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

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

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

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

14
Renji
2118 / 1477 / 348
Регистрация: 05.06.2014
Сообщений: 4,306
08.09.2015, 17:02 #2
Грубо и на пальцах - srand выбирает одну из (конечных) последовательностей псевдослучайных чисел, а rand эту последовательность потом читает. Вернее, под капотом последовательность генерируется налету, но да не суть. Вы постоянно дергаете srand, поэтому последовательность постоянно запускается сначала. Причем, одна и та же. Поэтому, вам нужно один раз вызвать srand, а потом сколько угодно раз вызывать rand.
1
Operok
172 / 170 / 46
Регистрация: 15.02.2015
Сообщений: 492
Завершенные тесты: 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 / 89
Регистрация: 13.12.2012
Сообщений: 2,111
Завершенные тесты: 1
08.09.2015, 17:10 #5
Цитата Сообщение от Renji Посмотреть сообщение
Вы постоянно дергаете srand, поэтому последовательность постоянно запускается сначала. Причем, одна и та же.
поправлю, она будет постоянна в течении 1 секунды, т.е srand инициализируется в зависимости от времени ф-цией time которая раз в секунду будет возвращать разные значения)
0
Operok
172 / 170 / 46
Регистрация: 15.02.2015
Сообщений: 492
Завершенные тесты: 2
08.09.2015, 17:16 #6
goto_, Не так выразился. Просто многократное использование srand позволяет в двух точках программы генерировать одинаковые "случайные" числа, логично что не надо его использовать внутри цикла в контексте вашей задачи.
0
Renji
2118 / 1477 / 348
Регистрация: 05.06.2014
Сообщений: 4,306
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 / 89
Регистрация: 13.12.2012
Сообщений: 2,111
Завершенные тесты: 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 / 89
Регистрация: 13.12.2012
Сообщений: 2,111
Завершенные тесты: 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 / 89
Регистрация: 13.12.2012
Сообщений: 2,111
Завершенные тесты: 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 / 89
Регистрация: 13.12.2012
Сообщений: 2,111
Завершенные тесты: 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
Привет! Вот еще темы с ответами:

Как сделать так, чтобы функция rand() возвращала разные значения - C++
Добрый вечер, как можно в visual studio в цикле каждый раз задавать новые рандомные значения перменной, к примеру for(int i=0;i&lt;10;i++) ...

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

Как зделать чтобы при открытии программы выводились разные числа - C++
Помогите пожалуйста. вобщем обьясните вот на таком примере #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int...

Как переопределить функцию так, чтобы она не только могла принимать разные параметры, но и возвращать тоже разные? - C++
То есть я считаю несправедливым, если такое проканывает: void f () {;} void f (int) {;} а такое нет: void f (int) {;} int f...


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

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

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