我正在编写一个原子在格子中移动的程序,通过选择与某个方向相关的随机数(其中有8个)测试该方向是否可行以及是否选择新的随机数号。
我想知道是否有办法从可以挑选的随机数池中排除那个随机数,这样程序就不会重复尝试选择相同的随机数
我目前正在使用一个看起来有点像这样的开关(不包括整个功能,因为它现在非常庞大......
int a = rand()%8;
switch (a)
{case 0:
...
case 1:
...
and so forth
}
答案 0 :(得分:3)
如何使用包含数字1到8的int向量,然后在每次迭代后随机随机播放?像:
std::vector<int> vOneToEight;
for (int i=1; i<9; ++i) vOneToEight.push_back(i); // {1, 2, 3, 4, 5, 6, 7, 8}.
std::random_shuffle(vOneToEight.begin(), vOneToEight.end()); // 1 to 8 with random order.
for (size_t i=0; i<vOneToEight.size(); ++i)
your_func(vOneToEight[i]); // Use the outcome in whatever way.
std::random_shuffle(vOneToEight.begin(), vOneToEight.end()); // Re-shuffle.
for (size_t i=0; i<vOneToEight.size(); ++i)
your_func(vOneToEight[i]); // Keep going if needed..
答案 1 :(得分:0)
这样的东西?
以下代码是用记事本极快编写的。如果您发现错误,请发表评论,谢谢!
/* main.cpp */
#include <vector>
#include <iterator>
typedef std::vector<int> NumberList;
int main()
{
NumberList list;
int Last = 0;
for(int i=0;i<5;i++)
{
// Prevent using it two times in a row
while( ( x = rand()%mod ) != last ){ }
// Prevent adding the same number two times in the list
bool alreadyIn == false;
for( std::vector<int>::iterator it = list.begin();
it != list.end(); it->next() )
{
if( *it == x )
alreadyIn = true;
}
if( !alreadyIn )
list.push_back(x);
// Do stuff with x
switch(x)
{
// ...
}
// Keep track of x
last = x;
}
return 0;
}
此代码可能会产生一个列表:
{1,0,2,4,9}
这意味着 0不会成为第一个项目。
修复该用途int Last = -1;
**如果rand()返回正整数。