c ++ генерирует случайные числа без повторений. Экран outout просто пустой с мигающим курсором.

Мое намерение состоит в том, чтобы генерировать случайные числа от 1 до 9 без повторения

#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
int randrange(int low,int high)   /* generates a random number within given range*/
{
return rand()%(low+high)+low+1;
}

int main()
{
int num[9]={0},i,j;
bool check;
for(i=0;i<9;i++)
{
check=false;
do
{
num[i]=randrange(1,9);

for(j=0;j<i;j++)
{
if( num[i]==num[j])    // checks whether number already exists in  the array
check=false;
else
check=true;
}
} while(check==false);
}

// the program is working fine without the repetition  check
// this section prints out the array elements
for(i=0;i<9;i++)
{
cout<<num[i]<<" ";
}
return 0;
}

3

Решение

Ваш дубликат проверки имеет недостаток: check устанавливается на результат проверки последней пары значений, а не на результат проверки всех предыдущих пар.

Вам нужно установить check = true перед внутренним циклом, затем перейдите к проверке всех элементов от нуля до i-1, Если проверка становится false в любой момент остановите цикл:

check = true;
for (j = 0 ; (check) && (j < i) ; j++) {
check = (num[i] != num[j]);
}

Кроме того, вам нужно исправить randrangeпотому что ваша текущая реализация возвращает значения в диапазоне 2..11:

int randrange(int low,int high)
{
return rand()%(high-low+1)+low;
}
5

Другие решения

Просто сгенерируйте числа от 1 до 9, затем перемешайте их случайным образом, используя std::random_shuffle.

int nums[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
std::random_shuffle(nums, nums + 9);

Это уйдет nums с номерами от 1 до 9 в случайном порядке, без повторов.

6

Ваша программа имеет ряд недостатков, одним из которых является диапазон случайных чисел, которые randrange функция возвращает. Это не от 1 до 9!

Однако непосредственная причина вашей программы (зависание программы) заключается в том, что вы установили check в falseзатем выполните цикл, который ничего не делает (потому что в первый раз, i является 0 и внутренний цикл с j никогда не выполняется), так check всегда будет false,

Проверьте другие ответы для решений.

0

Ваша программа, вероятно, зацикливается. Трудно читать ваш код из-за вашего странного отступа, но похоже, что в вашем цикле for есть логический недостаток:

check=false;
do
{
num[i]=randrange(1,9);

for(j=0;j<i;j++)
{
if( num[i]==num[j])    // checks whether number already exists in  the array
check=false;
else
check=true;
}
} while(check==false);

Вы можете удалить второй check=false; линия, чтобы сделать то, что я думаю, что вы пытаетесь сделать.

0

Хорошо, вы уже, возможно, выяснили проблему по ответу dasbinkenlight

И в дополнение к ответу Петра, вы можете использовать std::map тоже для достижения уникальных случайных чисел:

std::map<int,int> m;
srand (time (NULL));
for(i=0;i<9;i++){
do{
j=randrange(1,9);
}while(m.find(j)!=m.end());

m[j]; //insert into map, no need for value.
num[i]=j;
}
0
По вопросам рекламы [email protected]