有没有一种更快的方法,从特定的数字池中获取随机数
Is there a faster way, to get random numbers, from a specific pool of numbers
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 随机库生成随机数
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 当我尝试在 Main 中调用插入函数时,它不是取数字?
- scanf() 只取数字作为输入,避免使用其他字符
- 我可以通过取每个数字的模并取和来计算大数的模数吗?
- C++:如何在从给定缓存中排除数字的同时生成随机数
- 如何在C++中创建数字列表,以便它可以选择一个随机数?
- 取代表开始/结束的数字对,并删除重叠
- 我在一个生成随机数的程序工作,我想将这些数字存储在一个数组中
- 如何在C++中生成低于或高于某个数字的任何随机数?
- 在 Python/C++ 中用更改文件中的随机数替换数字
- 有没有一种更快的方法,从特定的数字池中获取随机数
- C++随机数生成器通常在 Visual Studio 中运行程序时在 2 次后停止生成数字
- 在随机数组中找到一个特定数字
- 我的随机数生成器不断获得相同的数字?(C )
- 如何根据用户输入"weighted"随机数生成,使某些数字优先于其他数字?
- 随机数发生器即使在播种后也会生成相同的数字
- 为什么这4个不同的随机数生成器函数会产生相同的一系列数字
- 没有重复数字的随机数生成器
- 生成一个没有重复数字的随机数