Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.73/26: Рейтинг темы: голосов - 26, средняя оценка - 4.73
neic777
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 138
#1

Рандомные числа без повтора

11.04.2013, 18:30. Просмотров 4708. Ответов 28
Метки нет (Все метки)

Как сделать чтобы рандомные числа выводились без повторения ?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main(){
int n,i,k=0;
 
printf("Vvedite kol. rand. 4isel ");
scanf("%d", &n);
 
for(i=0; i<n; i++){
k = i + rand() % n;
printf("\n%d", k); }
 
 
getch();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2013, 18:30
Ответы с готовыми решениями:

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

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

Избавиться от повтора вариантов при рекурсии
#include &lt;stdio.h&gt; void find (int *s ,int n) { int max = (n-1)/3; ...

Определить частоту повтора каждого символа в строке
Составить програму, которая считает частоту повтора каждого символа в строке

Найти все целые числа b, для которых а делится без остатка на b^2 и не делится без остатка на b^3
Пользователь вводит любое целое число а. Необходимо вывести все целые числа b ,...

28
RHB
33 / 33 / 17
Регистрация: 27.01.2013
Сообщений: 200
11.04.2013, 19:07 #2
Генерация массива целых случайных чисел, которые не повторяются

Специально для тебя написано В самом верху страницы форума)
0
neic777
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 138
11.04.2013, 19:08  [ТС] #3
я видел, но там всё слишком усложнено, мне надо проще
0
RHB
33 / 33 / 17
Регистрация: 27.01.2013
Сообщений: 200
11.04.2013, 19:09 #4
neic777, тогда задание давай
0
neic777
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 138
11.04.2013, 19:19  [ТС] #5
написал же. генерация определенного количества(n) рандомных чисел, без повторения

тут думаю и без комментариев всё ясно:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
 
void main(){
int n,i,k=0;
srand(time(NULL));
printf("Vvedite kol. rand. 4isel ");
scanf("%d", &n); 
 
for(i=0; i<n; i++){
k = i + rand() % n; 
printf("\n%d", k); }
 
 
getch();
}
0
KwanzaBot
9 / 9 / 8
Регистрация: 05.04.2013
Сообщений: 61
11.04.2013, 19:30 #6
Непонятно, ведь есть же шанс что числа будут повторятся в вашем коде? Или я что то недогнал.
0
RHB
33 / 33 / 17
Регистрация: 27.01.2013
Сообщений: 200
11.04.2013, 19:31 #7
KwanzaBot, вот он и просит чтобы не было такого шанса)
0
Байт
Эксперт C
17943 / 11933 / 2479
Регистрация: 24.12.2010
Сообщений: 24,043
11.04.2013, 19:31 #8
Заполнить массив случайными неповторяющимися числами
0
neic777
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 138
11.04.2013, 19:32  [ТС] #9
Байт, а с обычной переменно такое не прокатит ?
0
Platina
4 / 4 / 1
Регистрация: 09.04.2013
Сообщений: 38
11.04.2013, 19:33 #10
//Генерация случайных чисел в интервале [30; 50]

#include <iostream.h>
#include <stdlib.h>
#include <time.h>

int main()
{
int m;

srand(time(NULL)); //нужно для того, чтобы генерировать не одно и тоже число

//цикл для 10 чисел
for (int i = 0; i < 10; i++)
{
m = 30 + rand()%21;
cout << m << endl;
}
return 0;
}
0
KwanzaBot
9 / 9 / 8
Регистрация: 05.04.2013
Сообщений: 61
11.04.2013, 19:34 #11
Как вариант просто проверять совпадения и если что "дозаполнять"
0
RHB
33 / 33 / 17
Регистрация: 27.01.2013
Сообщений: 200
11.04.2013, 19:34 #12
neic777,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
 
int main()
{
    int n,i,k,z;
    srand(time(NULL));
    printf("Vvedite kol. rand. 4isel ");
    scanf("%d", &n); 
    k=rand() % n + 1;
    printf("%d ", k);
    for(i=1; i<n; i++)
    {
        z=k+ (rand() % n + 1);
        printf("%d ", z);
        k=z;
    }
    getche();
    return 0;
}
самое простое что я изобрел)
1
Байт
Эксперт C
17943 / 11933 / 2479
Регистрация: 24.12.2010
Сообщений: 24,043
11.04.2013, 19:38 #13
Цитата Сообщение от neic777 Посмотреть сообщение
с обычной переменно
Что значит с обычной переменной? В любом случае надо запоминать, какие числа уже выпали. Для этого создается массив-шкала по байтику на каждое число из диапазона. в нем отмечаются единичками впавшие числа. Следующий рандом берется уже r=rand()%(n-1) и находится просмотром этого массива байтиков r-ый не выпавший (0) И так далее...
0
neic777
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 138
11.04.2013, 19:46  [ТС] #14
RHB, не работает + не вижу в коде, где проверка

Добавлено через 7 минут

Байт, ок, тогда так можно сделать ?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
 
int main()
{
    int a[10],i,k,z;
    srand(time(NULL));
 
    for(i=0; i<=10; i++){
     k = 0 + rand() %30;
      if(a[k]==a[k+1]) break;
     printf("%d ", a[k]); }
 
    getch();
}
0
RHB
33 / 33 / 17
Регистрация: 27.01.2013
Сообщений: 200
11.04.2013, 19:47 #15
neic777, вот этот код бери:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
 
int main()
{
    int n,i,k,z;
    srand(time(NULL));
    printf("Vvedite kol. rand. 4isel \n");
    scanf("%d", &n); 
    k=rand() % n + 1;
    printf("%d ", k);
    for(i=1; i<n; i++)
    {
        z=k+ (rand() % n +1 );
        printf("%d ", z);
        k=z;
    }
    getche();
    return 0;
}
он работает!
0
Миниатюры
Рандомные числа без повтора  
neic777
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 138
11.04.2013, 19:49  [ТС] #16
RHB, хм...можешь пожалуйста прокомментировать часть с циклом ?
0
RHB
33 / 33 / 17
Регистрация: 27.01.2013
Сообщений: 200
11.04.2013, 19:53 #17
neic777, без проблем! Смотри: сначала мы сгенерировали нулевой элемент и назвали его "к". Он у нас всегда больше нуля так как k=rand() % n + 1;. Это до цикла. Потом мы к этому "к" добавляем число rand() % n + 1, которое по той же причине всегда больше нуля. Соответственно, "зет" всегда больше "к". Потом мы выводи зет. "к" присваиваем новое значение "зет" и опять генерируем число(в цикле) которое опять же 100% больше предыдущего)

Добавлено через 10 секунд
Понял?
1
neic777
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 138
11.04.2013, 19:57  [ТС] #18
RHB, спасибо)
0
Байт
Эксперт C
17943 / 11933 / 2479
Регистрация: 24.12.2010
Сообщений: 24,043
11.04.2013, 20:08 #19
RHB, Все славненько. Но что если нужно получать числа из заданного интервала?
0
RHB
33 / 33 / 17
Регистрация: 27.01.2013
Сообщений: 200
11.04.2013, 20:16 #20
Байт, а такого условия не было))

Добавлено через 19 секунд
ну в принципе я бы ввёл кеширование)

Добавлено через 3 минуты
самый НЕ оптимальный алгоритм для операции получения чисел из диапазона:

1-генерируем первый элемент из диапазона
2-записываем его в массив кэша; выводим на экран
3-генерируем новый элемент из диапазона
4-проверяем есть ли он в кэше
5-если нету то, к п.2; если есть то к пункту 3;

Добавлено через 2 минуты
ну тут ещё конечно в самом начале надо проверить что "ширина" диапазона больше либо равна тому количеству чисел, которые надо сгенерить. Потому как если меньше, то мы в любом случае получим совпадения, которые никак не исправить)
Пример: сгенерировать 5 рандомных чисел так чтобы они не повторялись, если эти значения чисел могут быть только "0" или "1".

Добавлено через 29 секунд
Могу ещё вариант предложить как генерировать случайные числа из заданного диапазона)
0
11.04.2013, 20:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2013, 20:16

Записать рандомные имена в структуру: Segmentation fault
Нужно записать рандомные имена в структуру,но дает Segmentation fault.Что не...

Функция rand() генерирует не совсем рандомные значения
Проблема заключается в следующем: Когда цикл в мэйне обращается к ф-ции...

Трехзначные числа без повторений
Есть функция, которая должна вернуть все трехзначные числа, начиная с нуля...


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

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

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