C ++中变量之间的随机性?

random between variables in C++?

首先,我在学习编程方面还是一个初学者。所以请原谅我!

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

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

而且我只随机化真值,我应该如何随机化它们?

例如,由于 a[0] 和 a[3] 为真,我只能随机数 0 OR 3。但随机数是这样的

int random = rand() % 4 + 0;

所以它将随机从范围 0 3. 我应该如何只用真值来做到这一点?请多多指教,谢谢!

如果我没理解错的话,你只想选择一个值为 true 的索引。

两种方法:

  • 只用真正的索引号创建一个数组,然后随机选择一个
  • 继续随机化你现有的一个,直到你得到真正的价值(不太好)

所以,在第一种情况下,你会得到类似这样的东西:

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

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

int random = rand() % 2;

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

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() ) ];
}

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

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)];

但是,如果由于某种原因无法预先创建符合条件的值列表,那么知道 you can select randomly from a sequence of unknown length 很有趣。因此,如果确实需要,您可以一次从数组中选择一个项目:

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;
  }  
}