有没有一种更快的方法,从特定的数字池中获取随机数

Is there a faster way, to get random numbers, from a specific pool of numbers

本文关键字:数字 取随机数 方法 一种 有没有      更新时间:2023-10-16

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

我将多次需要该方法,而当前的方法非常减慢代码速度。

#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/或 此处 使用 C++11 随机库生成随机数