我正在进行强力球抽奖,其中数字将按升序排列。快速选择(QP)将介于1-56之间,强力球(PB)将为1-46。我已经得到了很多照顾,但是我在QP中制定限制时遇到了麻烦,所以不会有双重数字。例如1,5,5,32,55。
是否可以使用if then else语句创建该限制?
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;
int size;
int arr[5] = {0, 1, 2, 3, 4};
int i=0;
int PowerBall[1] = {0};
int QP()
{
srand(time(NULL));
for (int i=0; i<5; i++) /
arr[i] = rand() % 56 + 1;
return 0;
}
int PB()
{
srand(time(NULL));
for (int i=0; i<5; i++)
PowerBall[i] = rand() % 56 + 1;
return 0;
}
void bubbleSort(int arr[], int size) //bubble sort function
{
bool swapped = true;
int j = 0;
int tmp;
while (swapped)
{
swapped = false;
j++;
for (int i = 0; i < size - j; i++) {
if (arr[i+1] < arr[i]) {
tmp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tmp;
swapped = true;
}
}
}
}
void print()
{
for (int i = 0; i < 5; i++)
cout << arr[i] << setw(8);
cout << PowerBall[i] << endl;
}
int main()
{
QP();
bubbleSort(arr, 5);
PB();
print();
system("pause");
return 0;
}
答案 0 :(得分:1)
将您的数字放在一个集合中以排除多重性(它们也将自动排序)
int newNum;
set<int> numSet;
for (int i(0); i < 5; ++i)
{
// calculate a number
while (!numSet.insert(newNum).second)
{
// calculate another number
numSet.insert(newNum);
}
}
请注意,一旦超过quickpick set(56)的功能,就不能进行新的插入,并且你最终会得到一个无限循环(你可能想在那里添加一个检查)
答案 1 :(得分:1)
一种可能性是Fisher-Yates shuffle。在您的情况下,它看起来像这样:
int number_list[56];
for (int i = 0; i < 56; i++)
number_list[i] = i + 1; // Initialise number_list
for (int i = 0; i < 5; i++) {
int r = rand() % (56 - i);
// Exchange number_list[i] and number_list[i + r]
int t = number_list[i];
number_list[i] = number_list[i + r];
number_list[i + r] = t;
}
现在您可以从number_list
数组中读取前五个值:number_list[0],...,number_list[4]
我已在this ideone link发布了完整的工作计划。
答案 2 :(得分:0)
从数组中随机取qp_source_arr [56],其中qp_source_arr [i] = i + 1;
然后当你随机选择一个索引时j = rand%56 + 1 arr [i] = gp_source_arr [j]; gp_source_arr [J] = - 1;
在那之后,当你再次采取-1选择,直到你得到的东西不是-1。
我希望这会对你有所帮助,而且我不会编写整个代码,因为你应该实现自己的代码,看起来像是作业:D