r = rand() - код

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
int a , r;
r = rand();
for(a = 0;r<=20000;a++)
    r = rand();
    cout<<"R = " << r <<"A = " << a;
return 0;
}

Зачем мы пишем два раза r = rand(), нельзя просто написать r = rand() перед for или после for, разницы же нету? Если не написать r = rand() после for, то будет генерироваться случайное число, а если r = rand() не написать перед for, то программа вообще работать не будет. И почему генерируется одно и то же число? Можете дать пояснения всем функция и r = rand()


Ответы (2 шт):

Автор решения: Harry

Ну смотрите -

r = rand();
for(a = 0;r<=20000;a++)

Если не вызывать первый rand(), то в r будет мусор, который вы и сравниваете с 20000. Что неверно - вам нужно сравнивать не мусор, а случайное значение, правда?...

Если так больше нравится -= перепишите код как

int a , r;
for(a = 0; (r = rand()) <= 20000; a++);
cout << "R = " << r << " A = " << a << endl;

Это просто метод определения, каким по счету будет сгенерировано случайное число, превышающее 20000. Если использовать ваш код - я бы переписал его с правильными отступами, чтобы это стало понятнее:

r = rand();
for(a = 0; r <= 20000; a++) r = rand();

cout << "R = " << r << "  A = " << a;

Одно и то же число - потому что генератор случайных чисел выдает при запуске одну и ту же последовательность, что полезно при отладке. Но вы можете избавиться от этого, дописав первой инструкцией после int main() {, например,

srand(time(0));

А вообще-то в С++ уже давно пора переходить на более современные средства из <random>, все ж таки уже 10 лет как стандарт С++11 принят...

→ Ссылка
Автор решения: CrazyElf

Мне кажется вообще более логично было бы проинициализировать r нулём вместо rand() и в инициализаторе цикла:

int a, r;
for(a = 0, r = 0; r <= 20000; a++)
    r = rand();

Принцип DRY придумали не просто так, он по многим причинам полезен, код без повторений вызывает гораздо меньше вопросов.

И в таком варианте переменная a содержит в итоге ровно число вызовов rand. Если нужно, чтобы там было строго число вызовов rand ДО того, как выпало число больше 20000, то можно потом вычесть 1 или инициализировать a в цикле -1, а не 0

→ Ссылка