C++中的变量之间随机

random between variables in C++?

本文关键字:之间 随机 变量 C++      更新时间:2023-10-16

首先,我仍然是学习编程的初学者。所以请原谅我!

如果我有 4 个布尔值,假设

a[0] = true
a[1] = false
a[2] = false
a[3] = true

我只随机化真实值,我怎么能随机化它们?

例如,由于 a[0] 和 a[3] 为真,我只能随机数 0 3。

int random = rand() % 4 + 0;

所以它会从范围 0 3 随机。我怎么能只用真正的值来做到这一点?请指导我,谢谢!

对于只有两个可能值可供选择的特定情况,您可以选择一个随机数并检查它是偶数还是奇数:

int random = (rand() % 2) ? 0 : 3;

更一般地说,您可以列出有资格选择的值,然后从该列表中选择一个随机元素:

std::vector<int> choices = { 0, 3, 9, 42 };
int random = choices[rand() % choices.size()];

这是我设法一起烹饪的解决方案。程序循环遍历 bool 数组,并将所有 true 的索引添加到临时数组中。

#include <vector>
#define ARRAY_SIZE 4
int main( char** argv, int argc )
{
    bool a[ ARRAY_SIZE ] = { true, false, false, true };
    std::vector< int > Available;
    for ( int i = 0; i < ARRAY_SIZE; ++i )
        if ( a[ i ] )
            Available.push_back( i );
    int random = Available[ rand() % static_cast< int >( Available.size() ) ];
}

如果我理解正确,您只想选择一个值为真的索引。

两种方法:

  • 创建一个只包含真实索引号的数组,并在那里随机选择一个
  • 继续随机化你现有的,直到你得到真正的值(不是很好)

因此,在第一种情况下,您将拥有以下内容:

b[0] = 0;
b[1] = 3;

然后,由于有 2 个这样的元素,您可以将随机发生器修改为:

int random = rand() % 2;

正如其他人指出的那样,正确的答案是构建一个合格值的列表,并从该列表中随机选择:

size_t randomInt(size_t min, size_t max) {
  static std::random_device rd;
  static std::mt19937 eng(rd());
  std::uniform_int_distribution<size_t> dist(min,max);
  return dist(eng);
}
int a[] = {true, false, false, true};
std::vector<int> eligible;
for(size_t i = 0u; i != 4u; ++i) {
  if(a[i])
    eligible.push_back(i);
}
auto random = eligible[randomInt(0u, eligible.size() - 1u)];

但是,如果由于某种原因无法预先创建符合条件的值列表,有趣的是,您可以从未知长度的序列中随机选择。因此,如果您确实需要,则可以一次性从数组中选择一个项目:

size_t n = 0u;
size_t random = 0u;
for(size_t i = 0u; i != 4u; ++i) {
  if (a[i]) {
    if (randomInt(0u, n) == 0)
      random = i;
    ++n;
  }  
}