笔试代码题--C++--输出概率相等的1和0
题目:有个输出0和1的函数(BIASED RANDOM),它以概率p输出1,以概率1-p输出0,以此RANDOM函数为基础,生成另一个RANDOM函数,该函数以1/2的概率输出1,以1/2的概率输出0
题目解答:
两次调用该RANDOM函数,如果其概率为P(x),调用2次
P(1) = p P(0) = 1-p
P'(1) =p P'(0) = 1-p
概率如下:
11 p*p 10 p*(1-p)
01 (1-p)*p 00 (1-p)*(1-p)
函数代码如下:
//#include <random>
int random_0_1()
{
int i = RANDOM(); //int i=rand();
int j = RANDOM(); //int j=rand();
int result;
while (true)
{
if (i == 0 && j == 1)
{
result = 0;
break;
}
else if (i == 1 && j == 0)
{
result = 1;
break;
}
else
continue;
}
return result;
}
衍生题目:从0到n-1中随机等概率输出m个不同的数
#include<iostream>
#include <time.h>
using namespace std;
//假设输入的n远大于m
void deng(int n,int m)
{
srand((unsigned)time(NULL));
for(int i = 0 ; i < n ; i ++)
{
if (rand() % (n - i) < m)
{
cout << i << endl;
m--;
}
}
}
int main()
{
int n = 6, m = 3;
deng(n,m);
return 0;
}
1.输出m个不同的数:
由for循环n次,且满足条件时才输出数字 i,可知,输出不同数的要求已满足,因为每次输出的都是 i 值,而 i 值每次都是不一样的,m--保证了程序在输出了m个值后就不再输出i。
2.等概率:
在i=0时,rand()%(n-i)的取值范围为0到n-1,共n个数,此时要输出0只需要rand()%(n-i)小于m,故i=0被输出的概率为m/n;
在i=1时,rand()%(n-i)的取值范围为0到n-2,共n-1个数,若i=0没有被输出,则m--未被执行,此时i=1被输出的概率为m/(n-1),若i=0已经被输出了,则m变为m-1,此时i=1被输出的概率为(m-1)/(n-1);
由概率论的知识,可知此时i=1被输出的概率为
P=(1-m/n)*(m/(n-1))+m/n*((m-1)/(n-1))=m/n;
以此类推,可知每个数被输出的概率都为m/n。