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

C++ 有没有更快的方法,从特定的数字池中获取随机数,c++,random,srand,C++,Random,Srand,我在寻找一种更快的方法,它允许我从存储在数组中的某个数字池中获取一个随机数 我需要多次使用该方法,而当前的方法严重减慢了代码的速度 #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 rndInde

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

我需要多次使用该方法,而当前的方法严重减慢了代码的速度

#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);
}
#包括
#包括
int main()
{      
常数int size=8;
int numberArray[size]={0,0,3,4,0,6,7,0};
srand(时间(0));
int rndIndex;
int rndNumber;
做
{
rndIndex=rand()%size;
rndNumber=numberArray[rndIndex];

}while(rndNumber如果我理解正确,那么您希望从
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;
}

你可以在这里阅读更多:或者在这里

为什么数组中有这些0?随机性会受到这些0的影响。创建非零列表怎么样?我正在编写骑士之旅(),此数组表示骑士可能的移动,0表示移动,这是不可能的,因为边缘或字段已通过如果代码在得到零时不执行任何操作,则我要做的第一件事是创建一个不带零的较小数组,然后只需使用rnd
Index=rand()%size\u不带零
我认为还是继续数组以删除零,但问题是您必须至少对整个数组进行一次处理。因为直到处理完数组后,您才知道有多少零。处理的持续时间与OP的代码相同。请参阅“更好的方法…”:这取决于你对“更好”的定义。看看你为了避免使用兰德而不得不跳过的障碍!
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;
}