Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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

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

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

Добавлено через 6 минут
проблема генерации случайных чисел возникла еще с сотворения компьютеров. абсолютно случайные числа, считается, нельзя сгенерировать ни человеку, ни компьютеру. наиболее подходящее решение проблему - выдавать числа, кажущиеся рандомными, то есть те, связь которых человеку сложно зафиксировать 'на взгляд'. к таким методам как раз относится привязывание к времени, т.к. оно постоянно изменяется независимо от программы. более 'случайные' генерации еще не придуманы человечеством.
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...
MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 91
22.05.2008, 14:18     Не могу разобраться... ( генератор случайных чисел) #5
по синтаксису рандом берется от 0 до числа, указанного в скобках. чтобы реализовать рандом в указанном периоде, придется в этом случае проводить еще олну генерацию.
в итоге выходит функция, подобная той, что уже описана, но заключенная в цикл do-while с условием пока не будет записано 10 различных цифр, запись в цикле происходит только, если сгенерированное удовлетворяет заданному условию.
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
}
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>
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 до которого, не включительно, будет производиться генерация
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; 
}
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++;}
 }
}
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;
}
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 в данном случае не исключенно что массив заполниться с повторением... потомучто только айный элемент проходит проверку с сгенерированным числом
MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 91
31.05.2008, 23:26     Не могу разобраться... ( генератор случайных чисел) #13
перед циклом следует определить первый элемент, в противном случае условие (R!=ar[i]) может принимать как тру, так и фолз. в остальном то же самое, что было предложено мной. (sr[i] == ar[i])
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2008, 11:55     Не могу разобраться... ( генератор случайных чисел)
Еще ссылки по теме:

Генератор случайных чисел C++
Генератор случайных чисел C++
C++ Генератор случайных чисел
C++ Генератор случайных чисел
C++ Генератор случайных чисел

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

Или воспользуйтесь поиском по форуму:
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; 
}
Yandex
Объявления
01.06.2008, 11:55     Не могу разобраться... ( генератор случайных чисел)
Ответ Создать тему
Опции темы

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