61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
1

Сгенерировать случайные числа в диапазоне от 1 до 20

21.09.2009, 15:54. Показов 7698. Ответов 31
Метки нет (Все метки)

Задача такова: Нужно написать рендум чисел в диапазоне например от 1 до 20 (не имеет значения).
С проверкой, что бы не повторялось число. (задание)

Забежал сюда:
https://www.cyberforum.ru/cpp-... 44753.html

однако сказали (преподаватель), что нужно по другому.

Собственно писать нужно в консольном С.

C
1
2
3
srand (unsigned (time (NULL)));
int a;  
a=rand()% 20+1;

Вот генератор рендумного число. Нужна проверка на повторяемость. Помогите плз ее осуществить.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.09.2009, 15:54
Ответы с готовыми решениями:

Сгенерировать случайные действительные числа в заданном диапазоне
Сгенерировать число равномерно от 0 до 1-это у меня получается: int main() { double a = {...

Программа должна сгенерировать 2 случайных числа в диапазоне от 2 до 9
Здравствуйте! я только начинаю изучать азы Си подскажите пожалуйста! Задача такая: программа...

Сгенерировать случайные двоичные числа в диапазоне от a до b
Помогите написать программу, даже не знаю с какой стороны к ней подойти, вот задание: Написать...

Как сгенерировать случайные числа в диапазоне от Ν до M, Z число раз
Здравствуйте. Я пишу небольшую программку и в ней мне нужно сгенерировать случайные вещественные...

31
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
21.09.2009, 16:05 2
заноси в массив полученные числа. тобишь перед генерацией понадобиться создать массив заданного размера. после каждой генерации будешь проверять наличие данного числа в массиве или просто флаг занятости ячейки под таким номером совпадающим с рендомным числом. если такое число есть генери снова. если нет, заполняй ячейку и в путь.
Однако, тогда потребуется отслеживать полное заполнения массива. иначе вечный цикл выйдет
1
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
21.09.2009, 16:08  [ТС] 3
для реализации знаний не достаточно =(... Ну допустим я массив сделал. А дальше не понял что нужно...
0
121 / 121 / 14
Регистрация: 14.03.2009
Сообщений: 462
21.09.2009, 16:17 4
как вариант такая реализация:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const int n=20;//число элементов
int array[n];//массив возможных рандомных значений
int schetchik;//количество оставшихся возможных рандомных значений
void reset()//установка начальных значений
{
  schetchik=20;
  for(int i=0;i<n;i++)
    array[i]=i+1;
}
int my_rand()
{
  if(schetchik)
    {
    int a=rand()%schetchik;//берем случайный элемент массива
    int b=array[a];
    array[a]=array[schetchik-1];
    array[schetchik-1]=b;//меняем его местами с последним
    schetchik--;
    return array[schetchik-1];
    }else return 0;//если допустимые значения закончились возвращаем 0
}
1
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
21.09.2009, 16:20 5
Вот генератор рендумного число. Нужна проверка на повторяемость. Помогите плз ее осуществить.
В https://www.cyberforum.ru/cpp-... 44753.html
есть "Генерация массива целых случайных чисел, которые не повторяются".
Чем не подходит ?
0
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
21.09.2009, 16:30 6
Как-то так

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
#include <iostream>
#include <ctime>
 
 
using namespace std;
#define  NUMB 10
void main()
{
  srand (unsigned (time (NULL)));
  int a, i;  
  bool arr[NUMB], full;
  for (i=0; i<NUMB; i++)
    arr[i]=false;
 
  while(1)
  {
    full=false;
    for (i=0; i<NUMB; i++)
      if (arr[i]==false)
        full=true;
 
    if (full==false)     // проверка на заполнение массива 
    {
      cout<<"all number"<<endl;
      break;
    }
 
    while (1)   // генерация неповторяющегося рендомного числа
    {
      a=rand()%NUMB+1; 
      if(arr[a-1]==false) 
      { 
        arr[a-1]=true; // проверка на повторяемость
        break;
      }
    }
    cout<<a<<" ";
  } 
  system("PAUSE");
}
Обрати внимание на получаемые числа. если будешь генерить от 2 до 20 то и заполнять ячейки надо со сдвигом 2
C++
1
if(arr[a-2]==false)
1
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
21.09.2009, 16:52  [ТС] 7
TanT,

Вот оно выводит на экран все числа в рендумном порядке, а как сделать что бы только 1?
0
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
21.09.2009, 17:07 8
убери первый while(1) тут
C++
1
2
3
  while(1)
  {
    full=false;
это для демонстрации, что все перебирает и останавливается.
P.S. если в принципе не требуется такое количество генераций, то и проверка на заполнения всего массива не нужна.
чисто генерация только тут
C++
1
2
3
4
5
6
7
8
9
10
while (1)   // генерация неповторяющегося рендомного числа
    {
      a=rand()%NUMB+1; 
      if(arr[a-1]==false) 
      { 
        arr[a-1]=true; // проверка на повторяемость
        break;
      }
    }
    cout<<a<<" ";
0
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
21.09.2009, 17:50  [ТС] 9
Не не нужно примерно так: идет цикл который длится 10 раз. И каждый раз генерируется случайное число. И в течении цикла не разу не повторяется.

То есть примерно так:
C
1
2
3
4
5
for(n=0; n<10; n++) // сам цикл, живет 10 раз =) 
{
cout<<a; //собственно само генерируемое число.
cin>>b; // так для прикола (проверка работоспособности цикла)
}
Добавлено через 2 минуты
Примерно так

Сгенерировало число 7
мы сделали какое то действие (например ввели папа) enter
Сгенерировало число 1
мы сделали какое то действие (например ввели папа) enter
Сгенерировало число 5
мы сделали какое то действие (например ввели папа) enter
Сгенерировало число 10

И так до окончания цикла....

Добавлено через 25 секунд
Примерно так

Сгенерировало число 7
мы сделали какое то действие (например ввели папа) enter
Сгенерировало число 1
мы сделали какое то действие (например ввели папа) enter
Сгенерировало число 5
мы сделали какое то действие (например ввели папа) enter
Сгенерировало число 10

И так до окончания цикла....
0
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
21.09.2009, 19:35 10
ну тогда только
C++
1
2
3
4
5
6
7
8
9
10
while (1)   // генерация неповторяющегося рендомного числа
    {
      a=rand()%NUMB+1; 
      if(arr[a-1]==false) 
      { 
        arr[a-1]=true; // проверка на повторяемость
        break;
      }
    }
    cout<<a<<" ";
дерзай в общем
1
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
22.09.2009, 10:49  [ТС] 11
вот я что то запутался. Получается весь код:

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
#include <iostream>
#include <ctime>
 
 
using namespace std;
 
#define  NUMB 10
 
void main()
{
  srand (unsigned (time (NULL)));
  int a, i;  
  bool arr[NUMB], full;
  for (i=0; i<NUMB; i++)
    arr[i]=false;
 
  while(1)
  {
    full=false;
    for (i=0; i<NUMB; i++)
      if (arr[i]==false)
        full=true;
 
    if (full==false)     // проверка на заполнение массива 
    {
      break;
    }
 
    while (1)   // генерация неповторяющегося рендомного числа
    {
      a=rand()%NUMB+1; 
      if(arr[a-1]==false) 
      { 
        arr[a-1]=true; // проверка на повторяемость
        break;
      }
    }
  } 
 
int b;
 
for(n=0; n<5; n++)
{
count<<a; //сама переменная рендумного числа
cin>>b;//просто переменная для проверки
}
}
Вот проблема в том, что число находящее в цикле случайной генерируется только 1 раз, остальные 4 раза оно одно и тоже.... Почему она (переменная) в цикле не генерируется?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11713 / 7220 / 1710
Регистрация: 25.07.2009
Сообщений: 13,221
22.09.2009, 11:46 12
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от nepster Посмотреть сообщение
Задача такова: Нужно написать рендум чисел в диапазоне например от 1 до 20 (не имеет значения).
С проверкой, что бы не повторялось число. (задание)
Ещё один вариант на С
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
#include <stdio.h>
#include <time.h>
 
/* Массив из ARRSIZE неповторяющихся целых */
#define ARRSIZE 10
#define MAXNUMBER 20
 
/* getInt возвращает случайное число от одного до lim */
int getInt(int lim){
    return rand() % lim + 1;
}
 
/* inArray - возвращает 1, если число val присутствует в массиве arr длинною в len, 0 - если отсутствует */
int inArray(int val, int *arr, int len){
    int i;
    for ( i = 0; i < len; i++ )
        if ( arr[i] == val )
            return 1;
    return 0;
}
 
int main(){
    int array[ARRSIZE];
    int i, val;
    
    srand((unsigned)time(NULL));
    
    for ( i = 0; i < ARRSIZE; i++ ){
        do {
            val = getInt(MAXNUMBER);
        } while ( inArray(val, array, i) );
        array[i] = val;
    }
    
    /* вывод массива */
    for ( i = 0; i < ARRSIZE; i++ )
        printf("array[%d] = %d\n", i, array[i]);
    
    return 0;
}
0
555 / 509 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
22.09.2009, 11:58 13
что значит "не повторяются"? вообще, или два соседних не должны быть одинаковыми? т.е. такое можно:

7, 10, 1, 7, ...

?
0
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
22.09.2009, 12:29  [ТС] 14
вот идет цикл который живет 10 раз... Смотрите получается

генерируется число случайное например 1
вводим переменную любую например b; b=papa;
генерируется число случайное например 7
вводим переменную любую например b; b=papa;
генерируется число случайное например 5
вводим переменную любую например b; b=papa;
генерируется число случайное например 2
вводим переменную любую например b; b=papa;
генерируется число случайное например 4
вводим переменную любую например b; b=papa;
генерируется число случайное например 9
вводим переменную любую например b; b=papa;
генерируется число случайное например 3
вводим переменную любую например b; b=papa;
генерируется число случайное например 10
вводим переменную любую например b; b=papa;
генерируется число случайное например 6
вводим переменную любую например b; b=papa;
генерируется число случайное например 8
вводим переменную любую например b; b=papa;


Все и выходим с цикла....
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11713 / 7220 / 1710
Регистрация: 25.07.2009
Сообщений: 13,221
22.09.2009, 12:45 15
nepster, Вам таки массив из 10 разных чисел, массив из 10 чисел, чтоб подряд двух одинаковых небыло, или 10 раз "papa" написать? В последнем случае зачем вообще что-то "генерировать"?
0
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
22.09.2009, 13:04  [ТС] 16
не не....

Смотрите идет цикл который живет 10 раз...

в течении цикла генерируется 10 раз рендумное число от 1 до 10, которое не повторяется.
а вводим переменную любую например b; b=papa; просто вводим переменную...

то есть
начался цикл:
генерация случайного числа например 7
далее нам предлагают ввести что то, мы вводим например мама,
и опять генерация случайного числа например 9...

в консоле примерно так

[IMG]http://s54.***********/i146/0909/05/4cfe81a41134.jpg[/IMG]

где т произвольная переменная
а числа должны быть не повторяемые от 1 до 10, в данном случае до 5
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11713 / 7220 / 1710
Регистрация: 25.07.2009
Сообщений: 13,221
22.09.2009, 13:22 17
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от nepster Посмотреть сообщение
в течении цикла генерируется 10 раз рендумное число от 1 до 10, которое не повторяется.
а вводим переменную любую например b; b=papa; просто вводим переменную...
Не повторяется вообще, или подряд два раза не должно быть одно и то же число? В первом случае прийдётся всё-таки массив из 10 чисел заполнять, а во втором вот так как-нибудь:
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
#include <stdio.h>
#include <time.h>
 
/* Количество попыток */
#define TRYINGS 10
/* "Потолок" для случайных чисел */
#define MAXNUMBER 10
 
/* getInt возвращает случайное число от одного до lim */
int getInt(int lim){
    return (lim == 0) ? 0 : rand() % lim + 1;
}
 
int main(){
    char buf[BUFSIZ];
    int i, val, lastval;
    
    srand((unsigned)time(NULL));
    
    val = lastval = 0;
    for ( i = 0; i < TRYINGS; i++ ){
        do {
            val = getInt(MAXNUMBER);
        } while ( val == lastval );
        printf("%d\t", val);
        fgets(buf, sizeof(buf), stdin);
        /* что-то сделать со строкой */
        lastval = val;
    }
    return 0;
}
Просто из любопытства - а зачем оно Вам?
0
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
22.09.2009, 13:39  [ТС] 18
[IMG]http://s39.***********/i086/0909/04/f470b305b575.jpg[/IMG]

Все равно повторяет =(... Мне нужно из 20 вопросов, случайно вывести 10. Идет масив с вопросами, например переменная а генерирует рендумное число, и выводится рендумный вопрос, мы на него отвечаем, если правильно опять генерируется число и выводится 2 вопрос. Как правило вопросы не должны повторяться.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11713 / 7220 / 1710
Регистрация: 25.07.2009
Сообщений: 13,221
22.09.2009, 14:43 19
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от nepster Посмотреть сообщение
Мне нужно из 20 вопросов, случайно вывести 10
Вот с этого и начинали бы
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
#include <stdio.h>
#include <time.h>
#include <string.h>
 
/* Массив из ARRSIZE неповторяющихся целых */
#define ARRSIZE 10
#define MAXNUMBER 20
#define STRLEN 256
 
/* getInt возвращает случайное число от нуля до lim */
int getInt(int lim){
    return ( lim == 0 ) ? 0 : rand() % lim;
}
 
/* inArray - возвращает 1, если число val присутствует в массиве arr длинною в len, 0 - если отсутствует */
int inArray(int val, int *arr, int len){
    int i;
    for ( i = 0; i < len; i++ )
        if ( arr[i] == val )
            return 1;
    return 0;
}
 
typedef struct {
    char question[STRLEN];
    char answ[STRLEN];
} Task_t;
 
/* Проверка правильности ответа */
int rightAnsw(char *answer, Task_t *task){
    return ( strcmp(answer, task->answ) == 0 ) ? 1 : 0;
}
 
/* собственно вопросы с ответами */
Task_t tasks[MAXNUMBER] = {
    { "Skolko zvyozd na nebe?", "mnogo" },
    { "Skolko rib v more?", "malo" },
    { "Skolko zyoren v meshke?", "100500" },
    { "Skolko moloka v krinke?", "litr" },
    { "Skolko kopeek v ruble?", "sto" },
    { "Skolko mishey v mishelovke?", "odna" },
    { "Skolko pul' v oboyme?", "sem'" },
    { "Skolko ogurcov v banke?", "desyat'" },
    { "Skolko yablok na dereve?", "ochen' mnogo" },
    { "Skolko volkov v stae?", "ne mnogo" },
    { "Skolko deneg pod parketom?", "netu deneg" },
    { "Skolko dirok v bublike?", "odna" },
    { "Skolko kilogrammov v pude?", "16" },
    { "Skolko litrov v bedone?", "tri" },
    { "Skolko zarplat v godu?", "12" },
    { "Skolko vihodnyh v nedele?", "dva" },
    { "Skolko stopkranov v samolyote?", "ned stopkranov" },
    { "Skolko gvozdey v sumke?", "odin" },
    { "Skolko pirogov v pechke?", "0" },
    { "Skolko popugaev v udave?", "38" }
};
 
int main(){
    int array[ARRSIZE];
    int i, val, right;
    char buf[STRLEN];
    
    srand((unsigned)time(NULL));
    
    for ( i = 0; i < ARRSIZE; i++ ){
        do {
            val = getInt(MAXNUMBER);
        } while ( inArray(val, array, i) );
        array[i] = val;
    }
    
    /* вывод вопросов */
    right = 1;
    for ( i = 0; i < ARRSIZE; i++ ){
        if ( right ) {
            printf("%02d: %s ", array[i] + 1, tasks[array[i]].question);
            fgets(buf, sizeof(buf), stdin);
            buf[strlen(buf) - 1] = 0;
            right = rightAnsw(buf, &tasks[array[i]]);
        }
        else {
            printf("LOOSER!\n");
            break;
        }
    }
    
    printf(( right == 0 ) ? "Try another time!\n" : "Ar you Vaserman or something?\n");
    
    return 0;
}

Не по теме:

Запарился вопросы придумывать :)

1
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844
22.09.2009, 15:53  [ТС] 20
спс биг
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2009, 15:53
Помогаю со студенческими работами здесь

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

Сгенерировать случайные числа
сгенерировать случайные числа 1) целое в интервале от 0 до 67. 2) целое двухзначное. 3)...

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

Как сгенерировать случайные числа?
Как сгенерировать случайные числа?


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru