ПредишенСледващото

Учебните алгоритмични пъзели често се срещат необходимостта от генериране на случайни числа. Разбира се, можете да ги получите от потребителя, но за да запълни масив с случайни числа в размер на 100 парчета може да бъде проблем.

За да ни помогнете функция на езика идва стандартно C библиотека (не C ++) ранд ().

Той генерира псевдо-случайна цяло число в интервала от 0 до RAND_MAX. Последното е константа, която варира в зависимост от езика на изпълнение, но в повечето случаи е 32 767.
Но какво, ако имаме нужда от случайни числа 0-9? Типично изход - да се използва разделението на модулна операция.

Ако имаме нужда число от 1 (не 0) до 9, можете да добавите yedinichku ...

Идеята е: да генерира случайно число от 0 до 8, и след добавяне на 1 то се превръща в случаен номер от 1 до 9.

И накрая, най-тъжното.
За съжаление, ранд () функция генерира псевдослучайни числа, т.е. числа, които се появяват на случаен принцип, но всъщност са поредица от стойности, изчислени на сложен алгоритъм, като параметър получаване т.нар зърно (семена). Т.е. генерирани функция ранд () числа в зависимост от стойността, която има зърно в момента на обаждането. А зърно съставител винаги настроен на 1. С други думи, поредните номера е псевдо-случайна, макар, но тя е винаги една и съща.
И това не е това, което ни трябва.

Коригиране на ситуацията помага на функция Srand ().

невалидни Srand (неподписан Int семена);

Тя определя зърното до стойност на параметъра, който е наречен. И поредица от числа, ще бъде различна, също.

Но проблемът остава. Как да направите случайна семена, защото всичко зависи от това?
Типичните добиви от положение - времето използване функция ().

time_t време (time_t * таймер);

Сега стойността на тази функция, ние можем да преминат към Srand функция () (в този случай неявна тип отливка), и ние ще имаме един прекрасен случаен семена.
И цифрите са забележителни и повтарящи се.

За да използвате ранда () и Srand (), трябва да включите заглавния файл . и за времето () се използва - файл .

Тук е пълен пример.

#include
#include
#include

използване на пространството от имена STD;

INT главната ()
<
Cout <<"10 random numbers (1..100): " < Srand (време (NULL));
за (INT I = 0; и<10;i++) cout < cin.get ();
връщане 0;
>

Това е кодът за C ++ (MinGW компилатор):
#include
...
Int RandomHi (междинно Hi)
Srand (GetTickCount ());
върне ранд () Hi;
>;

Това е мъдро да се използва GetTickCount (), тъй като в случай на стойността на времето (NULL) за една секунда ще бъде същото, което е недопустимо в някои sluagh.

И между другото, знаете, че в този подход плътността на случайна променлива разпределение няма да бъде единна и ще се направи към по-малки числа? Например, за «ранд ()% 100" вероятност за получаване на редица 0-67 включително, ще бъде малко по-висока от 68 до 99. В стъпка 1000 с плътност между 767 и 768 ще бъдат по-забележими.
Uniform плътност ще само делители са кратни на правомощията на две.
PS: А "" не може да се използва на всички. Напълно неразбираемо, че Radiocity другар имаше по това предвид.

Ето един въпрос: Дали побитов "и" ние ще се постигне желаната случайни числа? В крайна сметка, някои от стойностите на целевия интервал изобщо ще бъде недостижим.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!