Другие языки программирования и технологии

Пишу программу-лото на с (НЕ с++ или с#). Как сделать, чтобы генерировались случайные числа, кроме уже выпавших?

Лучше с кодом. Можно ссылку на готовое решение.
Виктор Савин
Виктор Савин
2 638
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#define N 25
int main() {
int box[N], i, j, n, a = 10, b = 100;
_Bool flag;
srand((unsigned)time(NULL));
if (b - a < N) exit(0);
for (i = 0; i < N; ++i) {
flag = false;
n = a + rand() % (b - a);
for (j = 0; j < i; ++j) {
if (n == box[j]) {
flag = !flag;
break;
}
}
if (flag) --i;
else box[i] = n;
}
for (i = 0; i < N; ++i) printf("%4i", box[i]);
putchar('\n');
getchar();
}
UT
Ulan Toktosunov
88 426
Лучший ответ
Сгенерируйте массив из идущих подряд чисел и перемешайте в случайном порядке. По сути сделаете то-же самое что происходит в мешке в настоящем лото =)

Реализация достаточно проста и готовое решение не хочу скидывать - ВЫ-же сами пишете. =)

ЗЫЖ В C++ есть готовый метод shuffle/random_shuffle. Просто к слову.
Виктор Савин Но простите, а как будет проверяться, что числа не повторяются?
Именно для твоего конкретного случая
main()
{
int i = 0, k, temp, flag, loto[90] ;
random() ; // инициализируем генератор
while(i < 90) // для всех бочонков
{
temp = rand()%91 ; // формируем случайное значение от 0 до 90
flag = 1 ; // флаг, что значение новое
for(k = 0 ; k < i ; k++) // для всех ранее сгенерированных номеров бочонков
if(temp == loto[k]) { flag = 0 ; break; } // если такое число уже было, то сбрасываем флаг нового значения
if(flag) loto[i++] = temp ; // значение новое, значит добавляем его к бочонкам
}
}
Александр Потапов Тут помимо того что скорость будет падать ближе к концу очень сильно ещё и поиск в массиве будет замедляться.
Могу только предложить записывать уже выпавшие числа (например в булевский массив), после чего проверять при каждой генерации. Уже выпадало - генерировать заново и т. д.