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


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

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

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

关于c++ - 简单的数字生成器,带有检查功能,避免重复,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51527488/

10-13 08:29