在 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 筛选条件里 在另一个表里查找结果为真或假的怎么写? 不好意思,没啥分。

VBA:比较两个字符串逻辑并返回真或假

C++ 'true' 和 'false' 关键字在 Visual C++ 6.0 中突然不是真或假

加入多个布尔值

我应该使用 Any() 还是 Count() ?哪个更快?如果 IEnumerable 对象中存在任何数据,两者都会返回相同的输出(真或假)吗? [复制]

使用 restkit 映射到复杂对象