gpt4 book ai didi

c++ - 有没有更快的方法从特定的数字池中获取随机数

转载 作者:行者123 更新时间:2023-11-28 04:13:19 25 4
gpt4 key购买 nike

我正在寻找一种更快的方法,它允许我从存储在数组中的特定数字池中获取随机数。

我会多次需要该方法,而当前的方法会大大降低代码速度。

#include <cstdlib>
#include <ctime>

int main()
{
const int size = 8;
int numberArray[size] = { 0, 0, 3, 4, 0, 6, 7, 0 };
srand(time(0));

int rndIndex;
int rndNumber;
do
{
rndIndex = rand() % size;
rndNumber = numberArray[rndIndex];
} while (rndNumber <= 0);
}

我喜欢从数组中获取一个随机数,除非随机数小于0

最佳答案

如果我没理解错的话,那么你想从 numberArray 中重复选择一个非零数字,但是数组中的数字在每次选择后都会发生变化(因为马移动到不同的方格具有不同的移动选项)。但是随着骑士的前进,您当前的解决方案变得越来越慢,因为移动数组中的零越来越多,这使得您必须在选择非零值之前循环更多次。

我看到这个问题的一个解决方案是首先计算数组中非零元素的数量。然后随机选择(n)到那个数,最后选择数组中的第n个非零数。此处显示想法的快速代码:

const int size = 8;
int numberArray[size] = { 0, 0, 3, 4, 0, 6, 7, 0 };
srand(time(0));

int numNonZero = 0;
for (int i = 0; i < size;++i) {
if (numberArray[i] > 0)
++numNonZero;
}

int selectionNum;
int rndNumber;

selectionNum = rand() % numNonZero;

for (int i = 0; true; ++i) {
rndNumber = numberArray[i];
if (rndNumber > 0 && selectionNum-- == 0)
break;
}

这会交换随机数量的循环,每个循环中有一个 rand() 绘制,两个最多 8 个元素的循环和一个 rand() 绘制。

顺便说一句!

因为我已经输入了这个,所以我只想提一下 rand() % X 是一种过时的生成随机数(0 到 X-1)的方法,而且 STL 有今天有更好的方法。

更好的方法是做这样的事情:

const int size = 8;
int numberArray[size] = { 0, 0, 3, 4, 0, 6, 7, 0 };
std::random_device rd;
std::mt19937 mt(rd()); // initialize the random generator

int numNonZero = 0;
for (int i = 0; i < size;++i) {
if (numberArray[i] > 0)
++numNonZero;
}

int selectionNum;
int rndNumber;

std::uniform_int_distribution<int> distribution(0, numNonZero - 1); // Set the distribution: 0 to numNonZero-1, both inclusive
selectionNum = distribution(mt); // Generate random number in the selected range

for (int i = 0; true; ++i) {
rndNumber = numberArray[i];
if (rndNumber > 0 && selectionNum-- == 0)
break;
}

您可以在此处阅读更多信息:http://www.cplusplus.com/reference/random/或这里 Generate random numbers using C++11 random library

关于c++ - 有没有更快的方法从特定的数字池中获取随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57213661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com