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表示移动,这是不可能的,因为边缘或字段已通过如果代码在得到零时不执行任何操作,则我要做的第一件事是创建一个不带零的较小数组,然后只需使用rndIndex=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;
}