c ++生成随机数而不重复。输出屏幕只有空白,光标闪烁。

时间:2013-08-06 16:30:26

标签: c++ random numbers non-repetitive

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

6 个答案:

答案 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);

}