Генератор случайных значений С++ для начинающих

Сайт не является учебником по программированию. Это только небольшой авторский сборник информации в помощь начинающим программистам.

Иногда в C++ для начинающих программистов возникает необходимость использовать различные случайные значения, например, для проверки правильности работы написанной программы сортировки чисел, требуется проверить как будет действовать программа, чтобы проверить действие работы такой программы требуется вводить различные значения и их может быть много.

Для ввода случайных различных значений как раз и используют генератор значений. Также его очень часто используют в играх — простейший пример угадай число. Для создания паролей, да и вообще много где.
Такой генератор значений на C++ пишется очень просто:

При каждом новом запуске такой программы на экран будет выводиться случайным образом либо 0 — либо 1.
Если разбирать этот маленький кусочек кода C++, то можно пояснить следующее команда srand вызывается для того, чтобы при необходимости каждый раз генерировать новые случайные значения.
А команда для вызова случайно генерированных значений объявляется как rand— Когда объявили команду rand открываем и закрываем фигурные скобки, после чего указываем диапазон случайных значений (В нашем приведенном примере мы указали, что нам нужно использовать 2 случайных значения). По умолчанию диапазон случайных значений начинает отсчет от нуля.
Написанным нами кодом мы объяснили генератору случайных значений, что нам нужны 2 значения, генерированных случайным образом.
0 и 1 = 2 значения, а так как по умолчанию в генераторе случайных значений отсчет идет от нуля, то наша программа и будет выводить на экран либо 0 — либо 1 (что как раз соответствует двум значениям)

Если бы мы написали:

то у нас бы выводился набор разных случайных значений от 0 до 100 (101 значение)

Чтобы указать какие именно значения нужно использовать, в команде rand сразу после закрывающейся круглой скобки ставится знак % и пишутся нужные нам случайные значения.

Выведет нам на экран случайно генерированные числа от 0 до 200

  Но нам может потребоваться диапазон не от нуля, а от другого значения, например чтобы генератор случайных значений выбирал числа из диапазона 200400 — тогда мы просто прибавляем к нашему генератору необходимое число: После прибавления начальная точка диапазона (по умолчанию ноль)- меняется

  Такой генератор случайных значений будет выдавать нам случайные значения в диапазоне чисел 200400

 
Сложного тут ничего нет.
Выводим на экран случайные значения используя Цикл for в С++

Присваиваем переменной случайное значение и выводим полученное значение переменной на экран:

Переменная будет принимать случайное значение от 200 до 400

 

Иногда,если вы сомневаетесь в правильно написанном диапазоне можно использовать цикл while

 Этот пример иногда полезен, например вам точно надо указать диапазон, а вы путаетесь, можно проверить. Если в этом примере ввести число не входящее в диапазон, то цикл станет бесконечным и программа не завершится. Весь фокус прост. Если же число входит в диапазон, то цикл завершится когда его встретит

Иногда требуется генерация больших чисел. Вот тут могут возникнуть вопросы
для начала пример от microsoft (http://msdn.microsoft.com/en-us/library/398ax69y.aspx)

 

  А вот так делал я. Только положительные шестизначные числа

Похожие темы

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

9 комментариев: Генератор случайных значений С++ для начинающих

  • Anonymous говорит:

    #include #include using namespace std;int main(){ srand(time(0)); cout<<rand()%2; return 0;}в визуал с++ выдает такую ошибку (всего 1)error C3861: time: идентификатор не найденчто с этим делать? что нужно, чтобы обозначить time?

    Автор сайта отвечает:

    (инклуды тут обрезаются)

  • Some intu Coder говорит:

    ну, я когда сомневался что инициализация сбрасывалась, делал так:

    Автор сайта отвечает:
    чтобы код отобразился верно, нужно его написать между тегами
    [php]Исходный код[/php]

     
    Объявлять переменную внутри цикла, это на кощунство похоже. Само объявление переменной лучше делать до цикла, а операции с уже объявленной ранее переменной производить внутри цикла.

    Но об оптимальности кажется сейчас не говорили. Думаю, кому надо, поймет что в форе может быть что — нить для их задачи. Я и цикл то воткнул исключительно для демонстрации, что рандом переинициализировался. согласен, выделять память под одну переменную внутри цикла в данном случае неразумно. Ладно, коль обучать нормальному коду, переделаю.

  • Vitaly Streltsov говорит:

    В вашем примере «А вот так делал я. Только положительные шестизначные числа» числа не настолько рандомны, как нужно — у всех на конце по два нуля от умножения в коде на 100. Код, например, генерировать , пока рандомное число не станет ХХХХ10, будет генерировать бесконечно 😉 Может быть, ваше число «double а» умножать не на 100, а на рандомное b, которое b>=100. ?

    Автор сайта отвечает:
    Можно просто генерировать еще одно число в диапазоне 0-99 и прибавлять это число к моему и следить, чтоб число не превысило нужное
    Это моя ошибка, но как-то внимания не обратил. Давно очень описывал эту тему.

  • Аноним говорит:

    как заполнить массив рандомными символами?

  • Vladimir говорит:

    Использую библиотеку <time.h>, и все что написанно тут перепробовал, но вот что меня смущает, рандомностью тут чето и не пахнет, если запускать (srand(time(o));  cout << rand()%»любое число»;) много раз подряд, видно что число которое каждый раз выдается немного больше предыдущего, и так пока не достигнет предела а потом начинает снова с минимального значения по возрастающей, а где рандомность?
    В Delphi функция randomize, как я над ней не издевался, действительно дает рандомное число из диапазона значений.

    Автор сайта отвечает:
    Это генератор псевдослучайных чисел. Слово “псевдо” обозначает, что они случайными не являются, так уж устроена функция rand(), она зависит от времени. Настоящие генераторы случайных чисел появляются с С++11, но даже там имеется зависимость от оборудования. #include <random>

    Но то, что Вы написали, где написали, что число слегка нарастает и потом всё сначала — это чушь.
    Вот небольшой (и неэффективный) пример, который генерирует убывающие последовательности. Будет работать с компиляторов, поддерживающих С++11

    Здесь просто показано, что Ваше изречение на самом деле чушь, и rand() генерирует разные числа, вплоть до обратносказанного.

  • Vladimir говорит:

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

    /*	Своеобразный рандомизатор */
    #include <conio.h>
    #include <iostream>
    #include <time.h>
    
    	unsigned int b(1);
    	for (int j = 0; j <= 10; j++){
    		for (int i = 0; i <= 3; i++){
    			srand(time(0));
    			b = (rand() * time(0)*rand()) / b;
    			b = (b % 10000); //Если вместо "10000" вставить случайное число
                                             //( спрашивать у игрока макс. кол-во выводимых на экран цифр,
                                             // и потом через рандом варьировать в заданном диапазоне) 
                                             //рандомизатор может стать еще рандомнее
    			cout << b << "\t";
    		}
    		cout << endl;
    	} 
    	_getch();
    	return 0;
    }

     

    Автор сайта отвечает:
    Не пригодится, есть готовые решения. Ваш генератор такой же генератор случайных чисел каким он и был, когда было просто rand(), только Вы усложнили всё.

  • Vladimir говорит:

    Тут в голову идея пришла, оцените если несложно, суть следующая:
    Источником энтропии(рандома) могут послужить числа с плавающей точкой(вещественные), ведь при любых математических операциях над данными типами у них есть предел точности(действительное кол-во знаков после запятой), превышая который точность теряется и получаются совершенно непредсказуемые значения, а что если использовать их как рандом?

    Автор сайта отвечает:
    Я не понял вопрос. Я не понял зачем изобретать свой random.

  • Vladimir говорит:

    Ну изобретать что то свое это только +(пускай что то похожее уже есть), развивает мышление и находчивость. А числовой диапазон… рассмотрим тип long double, он имеет 38 значений после запятой(если мне не изменяет память) из них только около 12 предел точности(если мне не изменяет память), соответственно в нашем распоряжении 26 значное число, сомневаюсь что кому то нужен рандом превышающий данный диапазон. Отсюда следует что можно указывать свой диапазон в рамках данного диапазона. И вуаля, мы получим самый рандомный рандом а не все те псевдорандомы что нам прелогают.

    Автор сайта отвечает:
    В зависимости от разрядности машины, число значимых чисел может варьироваться.
    Изобретение своего генератора случайных чисел — это очень сложная и нетривиальная математическая задача.
    С диапазоном я не то ляпнул.
    После запятой значения не случайны, они всегда будут одинаковыми при прочих равных условиях.

    Начиная с С++11 идёт не генератор псевдослучайных чисел чисел, хотя и становится генератором псевдослучайных при определённом стечении обстоятельств (каких именно сказать не могу).

    Когда вы используете функцию rand() из stdlib.h для настоящей случайности, вы уже используете ненастоящую случайность. Но только думается мне, что сейчас Вы не на той стадии, чтобы различить настоящую и ненастоящую, так как Вы придрались к rand() на абсолютно пустом месте и не по существу.

    Справедливости ради отмечу, что предлагаемый Вами алгоритм недалеко от алгоритма, используемого функцией rand(), только вместо не изменяющегося числа она использует системное время.

  • Алексей говорит:

    Спасибо отличная статья, единственный сайт в инете где я нормально и доходчиво узнал почему у меня не работал рандом!

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     
Яндекс.Метрика

НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Лучше бы вместо смс ввели

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок