5

我的目的是生成从 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;
}
4

6 回答 6

9

只需生成数字 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 的数字,没有重复。

于 2013-08-06T16:37:19.120 回答
5

您的重复检查循环有一个缺陷:check设置为检查最后一对值的结果,而不是检查所有前面对的结果。

您需要check = true在内部循环之前设置,然后继续验证从零到的所有项目i-1。如果检查false发生在任何时候,请停止循环:

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

此外,您需要修复randrange, 因为您当前的实现返回 range 中的值2..11

int randrange(int low,int high)
{
    return rand()%(high-low+1)+low;     
}
于 2013-08-06T16:36:27.883 回答
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;行来做我认为您正在尝试做的事情。

于 2013-08-06T16:55:04.283 回答
0

好的,您可能已经通过 dasbinkenlight 的回答找到了问题所在

除了彼得的答案之外,您还可以使用std::maptoo 来实现唯一的随机数:

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;
}
于 2013-08-06T17:05:47.953 回答
0

您的程序有许多缺陷,其中之一是randrange函数返回的随机数范围。不是1比9!

但是,您的程序(程序挂起)的直接原因是,您设置checkfalse,然后执行一个不执行任何操作的循环(因为第一次,iis0并且从未执行过内部循环j),所以check将永远是false.

检查其他答案以获取解决方案。

于 2013-08-06T16:49:15.387 回答
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);

}
于 2020-09-27T09:39:47.947 回答