我的目的是从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;
}
答案 0 :(得分:6)
只需生成数字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的数字随机排列,不会重复。
答案 1 :(得分:5)
您的重复检查循环有一个缺陷: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;
}
答案 2 :(得分:0)
您的程序存在许多缺陷,其中一个缺陷是randrange
函数返回的随机数范围。它不是1到9!
然而,程序的直接原因(挂起程序)是将check
设置为false
,然后执行不执行任何操作的循环(因为第一次,{{ 1}}为i
,且永远不会执行带0
的内循环),因此j
始终为check
。
检查解决方案的其他答案。
答案 3 :(得分: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;
行,以执行我认为您要执行的操作。
答案 4 :(得分: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;
}
答案 5 :(得分:0)
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
using namespace std;
void rnd(vector<int> &v, const int n){
for (size_t i=0;i<=n;++i){
v.push_back(i);
}
random_shuffle(v.begin(), v.end());
}
void PrintVector(const vector<int> &x){
for (size_t i=0;i<x.size(); ++i){
cout<<x[i]<<'\t';
}
}
int main(){
vector<int> a;
rnd(a,10);
PrintVector(a);
}