2014-01-10 54 views
0

对于编程分配我需要生成多组10个数字的,范围为1〜50,在每个单独的组没有重复的部分,所以我创建以下代码:生成在C++鲜明随机数

int Numbers[10]; //array to store the random numbers in 
bool Duplicate; //variable to check or number is already used 

srand(time(NULL)); //seeding the random number generator 

// do while loop used to allow user to generate multiple sets 
do { 

    Duplicate = false; // set check to false 

    //for loop to generate a complete set of 10 random numbers 
    for (int I = 0; I < 10; I++) 
    { 

     // do while loop used to generate random numbers until a distinct random number is generated 
     do 
     { 
     Numbers[I] = (rand()%50) + 1; // generates a random number 1 - 50 and stores it into Numbers[I] 

     // for loop used to check the other numbers in set for any repeats 
     for (int J = I - 1; J > -1; J--) // works backwards from the recently generated element to element 0 
       if (Numbers[I] == Numbers[J]) //checks if number is already used 
        Duplicate = true; //sets Duplicate to true to indicate there is a repeat 

     } while (Duplicate); //loops until a new, distinct number is generated 
    } 

//at this point in the program we should have an array Numbers[] with a set of 10 unique random numbers 1 - 50 

    // loop to print numbers to the screen 
    for (int I = 0; I < 10; I++) 
      cout << Numbers[I] << " "; // printing the element to the screen 

cout << endl; 
cout << "Do you want to run the program again (Y/N): "; // Asks user if they want to create another set of 10 numbers 
char Answer; // used to store users answer 
cin >> Answer; // stores users answer 

} while (Answer == 'Y' || Answer == 'y'); // loop program if the user wants to generate another set 

但是,我似乎遇到了产生随机数的do while循环的问题,直到产生一个新的不同的数字。 经过一些测试和修补后,我发现我不知何故在那里创建了一个无限循环,无法找出问题。

我认为可能导致问题的一些想法: rand函数如何改变种子,并且正在改变种子以创建新的伪随机数? - 我的循环检查重复超出数组边界?

任何意见和提示将不胜感激。

+0

我认为你不允许使用('unordered_')'set'? – chris

+0

为什么不从1 - 50填充一个数组并将其洗牌10次? – yizzlez

+0

因此,在您的do-while循环中,您在给定条件下将Duplicate设置为true,但永远不会设置为false。也没有断言。这将创建一个无限循环!你必须有条件离开循环。 – Graeme

回答

2

您忘记将Duplicate重置为false。第一次它被设置为true它仍然是true,启用了无限的do...while循环。

1

从1到50的有序数组开始,然后通过Fisher-Yates shuffle进行混洗。然后只需要前10个数字。

+0

给定user3179903有问题,那么正确实施洗牌的机会有多大?这是一个编程练习 - 必须从某处开始...... –

+0

@TonyD好点。 – Matt

1

请注意,在do-while循环开始时,您不会将Duplicate重新初始化,这意味着在您有一个重复的随机数之后 - Duplicate设置为true并且永远保持为真,因此 - 您的do-while循环将会永远运行。