Мое намерение состоит в том, чтобы генерировать случайные числа от 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;
}
Ваш дубликат проверки имеет недостаток: 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;
}
Просто сгенерируйте числа от 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 в случайном порядке, без повторов.
Ваша программа имеет ряд недостатков, одним из которых является диапазон случайных чисел, которые randrange
функция возвращает. Это не от 1 до 9!
Однако непосредственная причина вашей программы (зависание программы) заключается в том, что вы установили check
в false
затем выполните цикл, который ничего не делает (потому что в первый раз, i
является 0
и внутренний цикл с j
никогда не выполняется), так check
всегда будет false
,
Проверьте другие ответы для решений.
Ваша программа, вероятно, зацикливается. Трудно читать ваш код из-за вашего странного отступа, но похоже, что в вашем цикле 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;
линия, чтобы сделать то, что я думаю, что вы пытаетесь сделать.
Хорошо, вы уже, возможно, выяснили проблему по ответу 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;
}