我无法生成不会为此宾果游戏板重复的唯一值。我的代码相对简单:我使用嵌套的for循环来生成带有一些print语句的值;在每次嵌套迭代时,我检查生成的值是否存在于数组中。如果存在,则返回true,生成的值选择一个新的随机数。我认为通过在每次迭代时启动srand(),并使用循环中的count作为其种子,我将能够实现这一点。不幸的是,这似乎不太可能。
这是如何实现的?
我的代码:
#define MAX 100
#define MIN 1
using std::vector;
bool Board::checkValues(unsigned int array[], unsigned int valueToCheck)
{
int len = sizeof(array) / sizeof(int);
bool numberExists = false;
static int repeatCount = 0;
for(int i = 1; i < len; i++)
{
if (valueToCheck == array[i])
{
numberExists = true;
repeatCount++;
break;
}
}
return numberExists;
}
Board::Board(unsigned int numberOfRows, unsigned int numberOfColumns)
{
this->numRows = numberOfRows;
this->numColumns = numberOfColumns;
for (int i = 0; i < this->numRows; i++)
{
this->board.push_back(vector<unsigned int>(this->numColumns, 0));
}
this->valuesVisited[numberOfRows * numberOfColumns];
}
void Board::generate()
{
int repeatCount = 0;
for(int i = 0; i < this->numRows; i++)
{
bool atMid = false;
if (i == this->numRows / 2 - 1)
{
atMid = true;
}
for(int j = 0; j < this->numColumns; j++)
{
if (atMid && j == this->numColumns / 2 - 1)
{
printf(" Free ");
continue;
}
int seed = (i + 1) * (j + 1);
unsigned int randNumber = generateRand(MIN, MAX, seed);
bool numberExists = checkValues(this->valuesVisited, randNumber);
if (numberExists)
{
//int equation = (randNumber % 10) + (i * j) / (randNumber + randNumber);
randNumber = generateRand(MIN, MAX, seed) - (i * j);
repeatCount++;
}
this->valuesVisited[(i + 1) * (j + 1)] = randNumber;
this->board[i][j] = randNumber;
printf(" %d ", board[i][j]);
}
std::cout << "\n\n";
}
printf("You have %d repeats", repeatCount);
}
答案 0 :(得分:2)
考虑在std::vector
填写候选人编号,然后对其执行std::random_shuffle
并取第一个N.
答案 1 :(得分:1)
我用这个“生成n个唯一随机数”的常用方法是用一个数字的总范围填充一个向量(对于你这里,MIN - > MAX),random_shuffle()然后只拉出那么多从前面我需要的价值观。我认为如果性能非常关键,可能会有一些更有效的方法,但在我迄今为止所需的所有情况下它似乎都做得很好。
像
这样的东西std::vector<int> numbers;
int index = MIN;
std::generate_n(back_inserter(numbers), MAX - MIN + 1,
[&](){return index++;});
std::random_shuffle(numbers.begin(), numbers.end());
for(int i = 0; i < this->numRows; i++)
{
for(int j = 0; j < this->numColumns; j++)
{
this->board[i][j] = numbers.back();
numbers.pop_back();
}
}
答案 2 :(得分:1)
这是我为我的小项目提出的一些代码
没什么特别的,但它产生了独特的数字,对我来说它满足了需求。
for (int a = 0; a <= 89; a++) //populate the array with numbers 1-90
{
bNumbers[a].Number = a + 1;
}
for (int a = 0; a < bNumbers.Length; a++) //swap positions of the generated numbers
{
int rBingo = bMain.rndNum.Next(a, bNumbers.Length); //generate random number
// swap numbers round in the array
int tmpNum = bNumbers.Number;
bNumbers.Number = bNumbers[rBingo].Number;
bNumbers[rBingo].Number = tmpNum;
//end of swap
}