Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.68/92: Рейтинг темы: голосов - 92, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 13.05.2008
Сообщений: 7
1

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

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

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

Не могу полностью понять код программы. Генератор случайных чисел
Помогите написать толковые комментарии к этой части программы. Не очень ясно с каким числом мы...

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

Создать генератор случайных чисел с вычеркиванием сгенерированных чисел
Помогите пож. решить задачку: 1 Есть диапазон чисел от 1 до «i» 2 Необходимо выбрать случайное...

Генератор случайных чисел
Помогите пожалуйста нужно написать программу генератора случайных чисел на с++. Чтобы пользователь...

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

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

Добавлено через 6 минут
проблема генерации случайных чисел возникла еще с сотворения компьютеров. абсолютно случайные числа, считается, нельзя сгенерировать ни человеку, ни компьютеру. наиболее подходящее решение проблему - выдавать числа, кажущиеся рандомными, то есть те, связь которых человеку сложно зафиксировать 'на взгляд'. к таким методам как раз относится привязывание к времени, т.к. оно постоянно изменяется независимо от программы. более 'случайные' генерации еще не придуманы человечеством.
0
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
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 96
22.05.2008, 14:18 5
по синтаксису рандом берется от 0 до числа, указанного в скобках. чтобы реализовать рандом в указанном периоде, придется в этом случае проводить еще олну генерацию.
в итоге выходит функция, подобная той, что уже описана, но заключенная в цикл do-while с условием пока не будет записано 10 различных цифр, запись в цикле происходит только, если сгенерированное удовлетворяет заданному условию.
0
295 / 55 / 5
Регистрация: 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
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
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 96
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
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
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 96
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
295 / 55 / 5
Регистрация: 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
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
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 96
31.05.2008, 23:26 13
перед циклом следует определить первый элемент, в противном случае условие (R!=ar[i]) может принимать как тру, так и фолз. в остальном то же самое, что было предложено мной. (sr[i] == ar[i])
0
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 << "**** 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2008, 11:55

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

Генератор случайных чисел
Здравстуйте! А меня такая задачка. Нужно сгенерировать случайные числа с распределением Гаусса с...

Генератор случайных чисел
Подскажите пожалуйста, есть ли в lua генератор случайных чисел и если да то подскажите пожалуйста...

Генератор случайных чисел
subroutine Rundom(a,b,Number,k) implicit none integer i real(4) rn integer(4), intent(in)...

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


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

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

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