在 C++ 中分配真或假的随机对象
Posted
技术标签:
【中文标题】在 C++ 中分配真或假的随机对象【英文标题】:Random objects assigned true or false in C++ 【发布时间】:2020-07-29 05:04:26 【问题描述】:我必须分配一定数量的对象(基于百分比),这些对象已被随机分配为付费订阅属性的真实值,然后在优先级队列中按优先级和到达时间排序。目前,我只会为第一个到达的呼叫者分配订阅(真实)状态,并且似乎无法想到一种简单的方法来随机化哪些呼叫者被支付,哪些不是,因为每个呼叫对象都是在 for 循环中按顺序生成的。
例如:
如果平均每小时有 25 个呼叫者,其中 25% 被订阅,模拟为 24 小时,我将生成 600 个呼叫者,150 个订阅者和 450 个未订阅者,并随机分配 150 个subscribed = true
我想我需要将我的 for 循环范围限制更改为 n
,然后在 for 循环中为 bool subscribed
随机生成一个真或假值,但还要跟踪有多少次迭代是真假对于bool subscribed
,我尝试在下面实现它,但仍然得到随机数量的真/假。
主要
CallCenter dRus;
Rep r1;
bool subscribed = false;
int percentSubscribed = 0;
int numSubscribed;
int numNotSubscribed;
int countSubbed;
int countNotSubbed;
int n;
n = 24;
numSubscribed = (percentSubscribed / 100) * n;
numNotSubscribed = n - numSubscribed;
for (int i = 0; i <n; i++) //start sim by creating subscribed and unsubscribed callers
subscribed = rand() % 2;
if (subscribed == true) countSubbed++;
else countNotSubbed++; ;
if ((countSubbed > numSubscribed) )
subscribed = false;
dRus.generateCalls(subscribed);
else dRus.generateCalls(subscribed);;
subscribed = false;
for (int i = 0; i < numNotSubscribed; i++) //create not subscribed callers
dRus.generateCalls(subscribed);
呼叫中心
void CallCenter::generateCalls(bool subbed) //create a call object
Caller cust(subbed);
cust.generateInterArrivalTime(); //generate an inter-arrival time for the the call
cust.setArrivalTime(cust.getInterArrivalTime()+ clock); //set the arrival time
clock += cust.getInterArrivalTime(); // update the clock variable
callQ.push(cust); //put the call in the queue
【问题讨论】:
【参考方案1】:看来你的问题(在C调用者中选择S订阅者)可以解决如下:
-
创建一个包含 C 项的数组,其中 C 是调用者的数量。数组的项是 0, 1, ..., N − 1,表示对应调用者的位置(从 0 开始)。
随机排列项目数组(C++11 及更高版本为此目的有一个
shuffle
方法)。使用rand()
(尤其是rand() % 2
)并不是最好的做法,尤其是在C++ 中。请参阅以下问题:Why is the use of rand() considered bad?、Generating a random bit - lack of randomness in C rand()。
取出洗牌数组的前 S 项,并将值 true
分配给这些位置的调用者。
将值false
分配给剩余的调用者。
【讨论】:
std::iota 帮助第 1 步,std::fill 帮助第 3 步和第 4 步【参考方案2】:在我看来,你想要 15% 的输出,所以你可以这样做:
std::mt19937 g std::random_device() ;
auto sz = callers.size();
std::uniform_int_distribution<int> dist(0, sz - 1);
// force exaclty N_percent_subscriber
for(int i = 0; i < (sz * N_percent_subscriber) / 100; ++i )
int pos = dist(g); // get a 'true' random between 0 and sz-1
while ( callers[pos % sz].subscriber ) // if pos already subscriber
++pos; // keep searching for next non subscriber
callers[pos % sz].subscriber = true;
https://godbolt.org/z/jfajcE
【讨论】:
以上是关于在 C++ 中分配真或假的随机对象的主要内容,如果未能解决你的问题,请参考以下文章
SAP ABAP 里使用select 筛选条件里 在另一个表里查找结果为真或假的怎么写? 不好意思,没啥分。
C++ 'true' 和 'false' 关键字在 Visual C++ 6.0 中突然不是真或假
我应该使用 Any() 还是 Count() ?哪个更快?如果 IEnumerable 对象中存在任何数据,两者都会返回相同的输出(真或假)吗? [复制]