#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* 在50万个号里(1~500,000),随机挑选N个尾号为55,77的号。
并指出中签率。
*/
// 随机抽取n个数
int random_select(int selected[], int n)
{
int i;
// 全部清空为-1
for(i=0; i<n; i++) selected[i] = -1;
// 在500,000以内以55,77结尾的数一共10000个
// 下面的挑选过程,只记录其位置index,不计算具体的数字
// 例如, 55的index是0,77的index是1, 155的index是2, ...
// 按古典概型,中签率为n/10000
int count = 0;
srand((int)time(NULL)); // 还是设置一下种子
while(count < n)
{
// 得到一个0~9999之间的随机数
int r = rand() % 10000;
// 看这个数是不是已经选过了
bool exist = false; // 是否已经选过了
for(i=0; i<count; i++)
{
if(selected[i] == r)
{
exist = true;
break;
}
}
// 如果选出来的随机数已经存在,则继续random挑选
if(exist) continue;
// 如果选出来的随机数不存在,则记录之
selected[count] = r;
count ++;
}
// 把index转换成具体的数字
for(i=0; i<n; i++)
{
int index = selected[i];
int a = index / 2;
int b = index % 2;
if(b == 0)
selected[i] = a * 100 + 55;
else
selected[i] = a * 100 + 77;
}
return 0;
}
int main()
{
int selected[10];
random_select(selected, 10);
for(int i=0; i<10; i++)
{
printf("%d ", selected[i]);
}
return 0;
}
C++练习:尾号抽签
最新推荐文章于 2021-12-10 13:45:23 发布