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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 106, средняя оценка - 4.70
VadiK FoX
0 / 0 / 0
Регистрация: 13.05.2008
Сообщений: 7
#1

Не могу разобраться... ( генератор случайных чисел) - C++

17.05.2008, 08:31. Просмотров 13092. Ответов 13
Метки нет (Все метки)

Всех Приветствую ФорумЧатлеры!!!
Вопрос у меня возник вот в чем... Но сначало о себе... Программированием занимаюсь не давно Прошел стадию синтаксиса. В переди абстракция и классы... Компилирую На Dev-C++ под ДоС (жаль что после компиляции в досовском окне руский шрифт мароказябрами отображается).
Собственно загвоздка вот вчем:
Подскажите, кто може, как нписать генератор случайных чисел с пределом от 2 до 9. При чем, что бы все предыдущии последовательности не совпадали с последующими сгенерированными.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2008, 08:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу разобраться... ( генератор случайных чисел) (C++):

Генератор случайных чисел - C++
Еще одна тема о генераторе. Только вопрос, на который я пока не нашел ответа в других темах. Как сгенерировать случайное число в двух или...

Генератор случайных чисел - C++
Добрый день!У меня есть код #include <iostream> #include <cstdlib> #include <cstring> #include <ctime> char randSym() { ...

генератор случайных чисел - C++
Всем доброго времени суток, вот решил написать генератор чисел длины 768 бит, все отлично вроде и работает но только проблема в том что...

Генератор случайных чисел - C++
Здравствуйте, написал вот такой генератор псевдослучайных чисел в диапазоне 0-99 и задался вопросом о его скорости. Я считываю время...

Генератор случайных чисел - C++
В общем, нужно составить программу, которая реализует алгоритм генерации случайных чисел. Естественно не используя random. Перерыла массу...

Генератор случайных чисел (с UI) - C++
Я создал простенький генератор случайных чисел с Пользовательским Интерфейсом (GUI). Добавлено через 21 минуту Актуальна :)

13
VadiK FoX
0 / 0 / 0
Регистрация: 13.05.2008
Сообщений: 7
21.05.2008, 12:13  [ТС] #2
Я не могу понять, что это так сложно, или просто до этого ни кому нет дела... ( хотя все когдато начинали ) может я что то не так выразил.. Уточните...
0
MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 91
21.05.2008, 12:23 #3
1. привязать рандом к системному времени - стандартный вариант.
2. наваять трашную функцию, чтоб уж наверняка не совпадало. но совпадение все же имеет место. или если уж совсем категорично совпадение не принимается, в таком случае повторить рандом.

простой - второй вариант. многогдеиспользуемый - первый.

Добавлено через 6 минут
проблема генерации случайных чисел возникла еще с сотворения компьютеров. абсолютно случайные числа, считается, нельзя сгенерировать ни человеку, ни компьютеру. наиболее подходящее решение проблему - выдавать числа, кажущиеся рандомными, то есть те, связь которых человеку сложно зафиксировать 'на взгляд'. к таким методам как раз относится привязывание к времени, т.к. оно постоянно изменяется независимо от программы. более 'случайные' генерации еще не придуманы человечеством.
0
VadiK FoX
0 / 0 / 0
Регистрация: 13.05.2008
Сообщений: 7
22.05.2008, 11:58  [ТС] #4
-> MsDos спасибо за сведения... рандом я пробывал.. Но уменя на него кмпилятор ругается описывает ее как ошибку...синтаксиса

C++
1
2
3
4
5
6
7
int main()
{
int thi = random(2,9); 
    cout << thi;
    system("PAUSE");
    return 0; 
}
А алгоритм дейсвий должен быть примерно такой: Генерируем случайное число от 2 до 9 включительно, используем его, и сохраняем куда - нибудъ. Снова генерируем, проверяем, если нет совпадений с ранее сохраненным, используем его, потом сохраняем туда же куда сохранили первое (пускай это будет массив), и снова генерируем. Если полученне число совпадает с ранее сгенерированными во время проверки. Повторить генерацию. И до тех пор пока не пройдем линию от 2 до 9...
0
MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 91
22.05.2008, 14:18 #5
по синтаксису рандом берется от 0 до числа, указанного в скобках. чтобы реализовать рандом в указанном периоде, придется в этом случае проводить еще олну генерацию.
в итоге выходит функция, подобная той, что уже описана, но заключенная в цикл do-while с условием пока не будет записано 10 различных цифр, запись в цикле происходит только, если сгенерированное удовлетворяет заданному условию.
0
Spo1ler
292 / 52 / 3
Регистрация: 22.05.2008
Сообщений: 788
22.05.2008, 20:48 #6
C++
1
2
3
4
5
6
7
#include <time.h>
 
int main(){
    srand(time(NULL));
    int r;
    r=rand()%n
}
Данная программа генерирует числа от 0 до n-1
а если надо от 2 до 9, то код будет выглядеть так:

C++
1
2
3
4
5
6
7
#include <time.h>
 
int main(){
    srand(time(NULL));
    int r;
    r=rand()%8+2
}
0
VadiK FoX
0 / 0 / 0
Регистрация: 13.05.2008
Сообщений: 7
23.05.2008, 11:00  [ТС] #7
Я использовал вариант предложенный Spo1ler вот что у меня получилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <cstdio>
#include <time.h>
#include <iostream>
using namespace std;
int main()
{
srand(time(NULL));
int r;
for (int k = 0; k < 20; k++)
{
r=rand()%8+2;
cout << r <<"\n";
}
system("PAUSE");
return 0; 
}
Spo1ler каким образом ты определил линейку гинерации то 2 до 9??? допустим как сделать от 1 до 6
MsDos а с функцией
int thi = random(2,9);
cout << thi;
я так и не разобрался как она работает....

сводя код к минимуму до
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int r;
for (int k = 0; k < 40; k++)
{
r=rand()%8+2;
cout << r << "\n";
}
system("PAUSE");
return 0; 
}
я практически ни какой разници не наблюдаю.... В чем тогда преимущества кода указанногог выше??? с указанием библиотеки #include <time.h>
0
MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 91
23.05.2008, 18:44 #8
генерировать числа в интервале от n до m - тоже самое, что генерировать числа от 0 до (m-n) и прибавлять к результату (m-n)
функция rand()%8 - генерация чисел на отрезке [0;7], прибавив 2 к результату, получим генерацию чисел на отрезке [0+2;7+2]=[2;9]
1 до 6:
r=rand()%6+1;

int thi = random(2,9); - никак не работает, ошибка синтаксиса: в скобках может стоять только одно число, от 0 до которого, не включительно, будет производиться генерация
0
VadiK FoX
0 / 0 / 0
Регистрация: 13.05.2008
Сообщений: 7
26.05.2008, 12:29  [ТС] #9
Мозг расплавить можно... Вот что у меня по поводу этого вопроса получилось...
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
//генератор заполняющий массив случайными числами
#include <cstdio>
#include <iostream>
using namespace std;
int z = 0;
int fun(int a[], int k)
{ //циклом for пароверяем нет ли совпадений в массиве
for (int m =0;m<8;++m)
{ //совпадение в условии if
//приведет к выходу из функции и заставит
//ызывающий цикл for повторить генерацию
if (a[m]==k)
{return 0;}
}
//совпадений нет, заполняем элемент массива
//сгенерированным числом, и поднимаем число 
//счетчика для вызывающего чикла for 
a[z]=k;
z++;
return z; 
}
int main()
{
//задаем параметр случайности
srand(time(NULL));
int ar[8]={0};
//цикл иничиализации, которому условие прирывания 
//определяет функция int fun()
for (int f = 0; f !=8 ;  )
{ 
f=(rand()>>1)%8+2;
f = fun(ar,f);
}
//обнуляем глобальную переменную счетчика.
z=0;
//выводим содержимое масива на экран
for (int a=0;a!=8;a++)
{ cout << ar[a]<<" "; }
cout<<endl;
system("PAUSE");
return 0; 
}
0
MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 91
26.05.2008, 18:57 #10
можно все-таки проще написать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int rndm()
{
srand(time(NULL));
int r;
r=rand()%8+2;
return r;
}
 
 
void main ()
{
 int ar[10], i=0; 
 sr[0] = 0;
 while (i<10)
 {
  int R = rndm();
  if (R!=ar[i]) {ar[i]=R;i++;}
 }
}
0
Spo1ler
292 / 52 / 3
Регистрация: 22.05.2008
Сообщений: 788
26.05.2008, 19:04 #11
вот более оптимизированый и более безошибочный вариант кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int rndm()
{
srand(time(NULL));
return rand()%8+2;
}
 
void main ()
{
int ar[10], i=0; 
while (i<10)
{
int R = rndm();
if (R!=ar[i]) {ar[i]=R;i++;}
}
retutn;
}
0
VadiK FoX
0 / 0 / 0
Регистрация: 13.05.2008
Сообщений: 7
31.05.2008, 16:22  [ТС] #12
вот более оптимизированый и более безошибочный вариант кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int rndm()
{
srand(time(NULL));
return rand()%8+2;
}
 
void main ()
{
int ar[10], i=0; 
while (i<10)
{
int R = rndm();
if (R!=ar[i]) {ar[i]=R;i++;}
}
retutn;
}
Spo1ler в данном случае не исключенно что массив заполниться с повторением... потомучто только айный элемент проходит проверку с сгенерированным числом
0
MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 91
31.05.2008, 23:26 #13
перед циклом следует определить первый элемент, в противном случае условие (R!=ar[i]) может принимать как тру, так и фолз. в остальном то же самое, что было предложено мной. (sr[i] == ar[i])
0
VadiK FoX
0 / 0 / 0
Регистрация: 13.05.2008
Сообщений: 7
01.06.2008, 11:55  [ТС] #14
MsDos , Spo1ler , реализуя генератор в программу. вот что у меня получилось... только вот мне осталось придать случайность первой пересенной...
и поставить вопрос в каком варианте пользователь хочет проити задание...
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//********************************************************
// Программа для проверки знаний 
// таблици умножения
// Составил Я 11.05.2008
// последняя доработка 00.00.0000
//********************************************************
#include <cstdio>
#include <iostream>
using namespace std;
int z;
void proverka ( char& xc )
{
// бесконечный цикл который прерывается выходом из функции 
// при правильном выборе ответа
for( ; ; )
{
if ( ( xc == '1') || ( xc == '2' ) || ( xc == '3' ) )
{ return; }
else
{
cout << "\n !!!ERROR!!! \n" 
<< "vvedite pravilnii otvet na vopros: ";
cin >> xc;
}
}
}
int fun(int a[], int k)
{ 
for (int m =0;m<8;++m)
{ 
if (a[m]==k)
{return 0;}
}
 
a[z]=k;
++z;
return z; 
}
void funkcia(int ar[])
{
for (int f = 0; f<8; )
{ 
f=(rand()>>1)%8+2;
f = fun(ar,f);
}
z=0;
}
int main ()
{
int array[8];
int ot = 0, d = 0, nd = 0;
char dr = '0';
double p = 0;
 
srand(time(NULL));
cout << " programma testiryet znanie tabl. ymnoj.\n"
<<"---------------------------------------------\n"
<<"K kakoi kategorii vi sebia otnosite?\n"
<<"\n1. Slabak\n2. Sredne\n3. Professional\n"
<<"(viberete variant otveta cifroi): ";
cin >> dr;
proverka(dr);
cout<<"---------------------------------------------"
<<"\nkontrol proiden,\npristypim k zadaniy"
<<endl;
for (int x = 2;x < 10; ++x)
{ cout<<"---------------------------------------------\n";
for (int qw = 0;qw < 8;++qw)
{array[qw]=0;}
funkcia(array); 
 
for (int y=0;y<8;++y)
{
cout << "\n" << x << " x " << array[y] << "= ";
cin >> ot; 
if (x*array[y] == ot )
{++d; cout << ot <<" <=> "<<x*array[y]<<" +" <<endl;}
else
{++nd; cout << ot <<" <-> "<<x*array[y]<<" -" <<endl;}
 
}
}
p = 100*d/64;
cout <<
"\n---------------------------------------------"
<< "\n prav. otveti " << d << "WT\nne prav. otveti " 
<< nd << "WT"
<< "\nchto est " << p <<"%" 
<<"\nocenka: ";
switch(dr)
{
case '3':
if ( p == 100 )
{cout<<"5";}
else if ( 98.4375 == p )
{cout<<"4";}
else if ( 98.4375 > p )
{cout<<"2";}
break;
case '2':
if ( p <= 62.5 )
{cout<<"2";}
else if ( p <= 75 )
{cout<<"3";}
else if ( p <= 93.75 )
{cout<<"4";}
else if ( p > 93.75 )
{cout<<"5";}
break;
 
case '1':
if ( p <= 25 ) 
{cout<<"2";}
else if ( p <= 50 )
{cout<<"3";}
else if ( p <= 90 )
{cout<<"4";}
else if ( p <= 100 )
{cout<<"5";}
else if( p > 100 )
{cout<<"ne realno";}
break;
default:
cout << "fuck off"; break;
}
cout <<
"\n---------------------------------------------"
<< "\nprogramma Zavershena \n";
 
system ("PAUSE");
return 0; 
}
Добавлено через 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
//генератор заполняющий массив случайными числами
#include <cstdio>
#include <iostream>
using namespace std;
int z = 0;
int fun(int a[], int k)
{ //циклом for пароверяем нет ли совпадений в массиве
for (int m =0;m<8;++m)
{ //совпадение в условии if
//приведет к выходу из функции и заставит
//ызывающий цикл for повторить генерацию
if (a[m]==k)
{return 0;}
}
//совпадений нет, заполняем элемент массива
//сгенерированным числом, и поднимаем число 
//счетчика для вызывающего чикла for 
a[z]=k;
z++;
return z; 
}
int main()
{
//задаем параметр случайности
srand(time(NULL));
int ar[8];
for (int w=0; w<10; ++w)
{
//обнуляем глобальную переменную счетчика.
z=0;
cout<<"-------------------------------------------\n";
//инициализация массива нулевым значением
for (int r=0;r<10; ++r)
{ar[r]=0;}
//цикл иничиализации случайностью, которому условие прирывания 
//определяет функция int fun()
for (int f = 0; f !=8; )
{ 
f=(rand()>>1)%8+2;
f = fun(ar,f);
}
//обнуляем глобальную переменную счетчика.
//выводим содержимое масива на экран
for (int a=0;a!=8;a++)
{ cout << ar[a]<<" "; }
cout<<endl;
}
system("PAUSE");
return 0; 
}
0
01.06.2008, 11:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2008, 11:55
Привет! Вот еще темы с ответами:

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

Генератор случайных чисел - C++
Есть функция, генерирующая случайные целые числа с помощью линейного конгруэнтного метода. Нужно сделать частотный побитовый тест для...

Генератор случайных чисел - C++
Добрый вечер! Собственно-то тако задание: необходимо правильно задать параметры для ЛКГ и написать функцию, возвращающую случайные числа,...

Генератор случайных чисел - C++
Вот написал программу, которая генерирует матрицу 9*9. В каждой строке - от 1 до 9, не повторяются В каждом стобце - то же самое. ...


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

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

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