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

时间:2018-07-25 20:53:51

标签: c++ windows

我正在尝试编写简单的函数来检查随机生成的值是否已在数组中。我想简单地找到一个数字生成器而不重复。不幸的是,我的代码无法正常工作。我的意思是,它仍然会产生重复的值。谁能告诉我我在做什么错?

  

检查数组中是否存在值:

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;

}

1 个答案:

答案 0 :(得分:1)

使用现代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和均匀分布为您提供适当的随机值。

“集合”负责过滤重复项。

如果您只想改组例如数字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;
}