weixin_42722475 2018-10-04 13:05
浏览 1334

关于random的问题,以给定概率返回0/1.

输入给定per,当per小于0.2 时,最后a的个数达到给定值的概率反而变成0了,一直没搞懂,求指点

代码如下
#include
#include "random.h"
#include "console.h" // for GWindow
#include "simpio.h" // for getLine
using namespace std;

int main ()
{

int voters=getInteger("Enter number of voters");
double can=getDouble("Enter percentage spread between candidates");
double per=getDouble("Enter voting error percentage");
int a=0;
double inv=0;
for(int j=0;j<500;j++){
    for(int i=0;i<voters*can;i++){
        if(randomChance(per)) a++;
    }
    if(a>=voters*can/2) inv++;
    a=0;

}
double ratio=1.0*inv*100/500;
cout<<ratio<<"%";
return 0;
}

random.h:

#include "random.h"
#include
#include
#include
#include
#include "private/static.h"

/* Private function prototype */

static void initRandomSeed();

/* internal buffer of fixed random numbers to return; used by autograders */
STATIC_VARIABLE_DECLARE_COLLECTION_EMPTY(std::queue, fixedBools)
STATIC_VARIABLE_DECLARE_COLLECTION_EMPTY(std::queue, fixedInts)
STATIC_VARIABLE_DECLARE_COLLECTION_EMPTY(std::queue, fixedReals)

namespace autograder {
void randomFeedBool(bool value) {
STATIC_VARIABLE(fixedBools).push(value);
}

void randomFeedClear() {
STATIC_VARIABLE(fixedBools) = std::queue();
STATIC_VARIABLE(fixedInts) = std::queue();
STATIC_VARIABLE(fixedReals) = std::queue();
}

void randomFeedInteger(int value) {
STATIC_VARIABLE(fixedInts).push(value);
}

void randomFeedReal(double value) {
STATIC_VARIABLE(fixedReals).push(value);
}
}
/* end 'fixed' internal stuff */

bool randomBool() {
return randomChance(0.5);
}

/*

  • Implementation notes: randomChance
  • ----------------------------------
  • The code for randomChance calls randomReal(0, 1) and then checks
  • whether the result is less than the requested probability. */ bool randomChance(double p) { if (!STATIC_VARIABLE(fixedBools).empty()) { bool top = STATIC_VARIABLE(fixedBools).front(); STATIC_VARIABLE(fixedBools).pop(); return top; } initRandomSeed(); return randomReal(0, 1) < p; }

int randomColor() {
if (!STATIC_VARIABLE(fixedInts).empty()) {
int top = STATIC_VARIABLE(fixedInts).front();
STATIC_VARIABLE(fixedInts).pop();
return top & 0x00ffffff;
}
initRandomSeed();
return rand() & 0x00ffffff;
}

// don't want to depend on gwindow.h
extern std::string convertRGBToColor(int rgb);

std::string randomColorString() {
return convertRGBToColor(randomColor());
}

/*

  • Implementation notes: randomInteger
  • -----------------------------------
  • The code for randomInteger produces the number in four steps: *
  • 1. Generate a random real number d in the range [0 .. 1).
  • 2. Scale the number to the range [0 .. N) where N is the number of values.
  • 3. Translate the number so that the range starts at the appropriate value.
  • 4. Convert the result to the next lower integer. *
  • The implementation is complicated by the fact that both the expression *
  • RAND_MAX + 1 *
  • and the expression for the number of values *
  • high - low + 1 *
  • can overflow the integer range. These calculations must therefore be
  • performed using doubles instead of ints. */ int randomInteger(int low, int high) { if (!STATIC_VARIABLE(fixedInts).empty()) { int top = STATIC_VARIABLE(fixedInts).front(); STATIC_VARIABLE(fixedInts).pop(); if (top < low || top > high) { // make sure the value is in the given range // (assumes that low/high don't overflow int range) int range = high - low + 1; top = low + std::abs(top) % range; } return top; } initRandomSeed(); double d = rand() / (double(RAND_MAX) + 1); double s = d * (double(high) - low + 1); return int(floor(low + s)); }

/*

  • Implementation notes: randomReal
  • --------------------------------
  • The code for randomReal is similar to that for randomInteger,
  • without the final conversion step. */ double randomReal(double low, double high) { if (!STATIC_VARIABLE(fixedReals).empty()) { double top = STATIC_VARIABLE(fixedReals).front(); STATIC_VARIABLE(fixedReals).pop(); return top; } initRandomSeed(); double d = rand() / (double(RAND_MAX) + 1); double s = d * (high - low); return low + s; }

/*

  • Implementation notes: setRandomSeed
  • -----------------------------------
  • The setRandomSeed function simply forwards its argument to srand.
  • The call to initRandomSeed is required to set the initialized flag. */ void setRandomSeed(int seed) { initRandomSeed(); srand(seed); }

/*

  • Implementation notes: initRandomSeed
  • ------------------------------------
  • The initRandomSeed function declares a static variable that keeps track
  • of whether the seed has been initialized. The first time initRandomSeed
  • is called, initialized is false, so the seed is set to the current time. */ static void initRandomSeed() { static bool _initialized = false; if (!_initialized) { srand(int(time(nullptr))); rand(); // BUGFIX: throwaway call to get randomness going _initialized = true; } }
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 关于#python#的问题:功能监听网页
    • ¥50 comsol稳态求解器 找不到解,奇异矩阵有1个空方程返回的解不收敛。没有返回所有参数步长;pid控制
    • ¥15 怎么让wx群机器人发送音乐
    • ¥15 fesafe材料库问题
    • ¥35 beats蓝牙耳机怎么查看日志
    • ¥15 Fluent齿轮搅油
    • ¥15 八爪鱼爬数据为什么自己停了
    • ¥15 交替优化波束形成和ris反射角使保密速率最大化
    • ¥15 树莓派与pix飞控通信
    • ¥15 自动转发微信群信息到另外一个微信群