【问题标题】:random between variables in C++?C ++中变量之间的随机数?
【发布时间】:2015-03-14 02:49:14
【问题描述】:

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

如果我有 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 TO 3 范围内。我想如何只用真值来做到这一点?请指导我,谢谢!

【问题讨论】:

  • “我应该如何只使用真值来做到这一点?” - 没有意义,因为输出总是“真”
  • 如果我理解正确:您不是在尝试选择布尔值,而是在尝试选择一个数字,而布尔值表明 0 和 3 是唯一有资格被选择的数字.
  • 这个问题很不清楚。请提供所需行为的详细示例。

标签: c++ random boolean


【解决方案1】:

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

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

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

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

【讨论】:

  • 除了% 是有偏差的,并且还使用了在许多情况下具有最差随机性的值的最低位。
  • 无论如何,C++11 的随机生成器都比 rand() 好。但这与实际问题无关,我不想让事情变得不必要的混乱。
  • 嗨@Wyzard 我无法列出可以在这种情况下选择的值,因为它永远在变化,一个实例可能是 a[0] = true, a[1 ] = false , a[2] = true 和 a[3] = true 其他实例都可能是假的。如前所述,如果第一个实例是这种情况,我只能随机化 a[0]、a[2] 和 a[3],不包括 a[1] false。
  • 这只是意味着您每次都需要创建一个新的选择列表。从一个空向量和push_back 每个应该符合条件的值开始。
【解决方案2】:

这是我设法一起烹饪的解决方案。程序循环遍历 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() ) ];
}

【讨论】:

    【解决方案3】:

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

    两种方法:

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

    所以,在第一种情况下,你会有类似的东西:

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

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

    int random = rand() % 2;
    

    【讨论】:

    • 嗨 Shomz,如果您的 b[0] = true 且 b[1] = false,则 b[2] = true。你怎么能随机化 0 OR 2 而不包括 1 ?
    • 嗨,我的b 值不能为假,实际上它们是指真正的a 值的整数(它们是0 和3,这就是为什么我的b 是@987654326 @)。它基本上是您原始代码的扩展 - 与 Wyzard 建议的概念相同。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-01-23
      • 1970-01-01
      • 2017-11-20
      • 2021-12-25
      • 2021-04-30
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 2010-12-06
      相关资源
      最近更新 更多