具有检查功能的简单数字生成器,以避免重复

Simple number generator with check function to avoid repeating

本文关键字:检查 功能 数字 简单      更新时间:2023-10-16

我正在尝试编写一个简单的函数来检查随机生成的值是否已经在数组中。我想简单地到达一个数字生成器而不重复。不幸的是,我的代码不起作用。我的意思是,它仍然会给我产生重复的值。有人能告诉我我做错了什么吗?

检查数组中是否存在值:

bool valueExistsInArray(int* array, int value) {
if ((sizeof(array) / sizeof(*array)) <= 0) 
return false; 
int i = 0;
do {
if (array[i] == value)
return true;
i++;
} while (i < (sizeof(array) / sizeof(*array)));
return false;
}

从指定范围生成随机值:

int generateRandomValue(int from, int to) {  
return (std::rand() % (to-from+1)) + from;
}

主要功能:

int main()
{
srand((unsigned int)time(NULL));
int array[10];
int i = 0;
do {
int value = generateRandomValue(1, 10);
if (!valueExistsInArray(array, value)) {
array[i] = value;
i++;
}
} while (i < (sizeof(array) / sizeof(*array)));
for (int i = 0; i < (sizeof(array) / sizeof(*array)); i++)  
std::cout << "Index: " << i << " Value: " << array[i] << "n";

_getch();
return 0;
}

如何使用现代c++的简单示例

#include <random>
#include <set>
#include <iostream>

int main()
{
const uint32_t minValue = 0;
const uint32_t maxValue = 1000000;
const size_t numValues = 100;
std::random_device rd;
std::uniform_int_distribution<int> dist(minValue, maxValue);
std::set<uint32_t> myNumbers;
while (myNumbers.size() < numValues)
{
myNumbers.insert(dist(rd));
}
for (const auto& val : myNumbers)
{
std::cout << val << "n";
}
return 0;
}

random_device和均匀分布为您提供适当的随机值。

"set"负责过滤重复项。

如果你只想打乱一个向量,例如数字0到100,请使用std::shuffle,例如:

#include "stdafx.h"
#include <algorithm>
#include <random>
#include <vector>
#include <iostream>

int main()
{
std::random_device rd;
std::mt19937 g(rd());
std::vector<uint32_t> myNumbers(100);
std::iota(myNumbers.begin(), myNumbers.end(), 0);
std::shuffle(myNumbers.begin(), myNumbers.end(), g);
for (const auto& val : myNumbers)
{
std::cout << val << "n";
}
return 0;
}