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;
}
}
首先,我在学习编程方面还是一个初学者。所以请原谅我!
如果我有 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;
}
}