牛客网在一周年纪念系列活动中,其中有一个抽奖的环节,在1亿会员中随机抽出100万幸运会员,并发送相应礼品。
请帮助牛客网设计一个抽奖算法。 要求:
1)不能重复中奖
2)个位数为6的用户中奖概率是其他用户的2倍
3)rand()生成的最大值不超过2的10次方-1
//1亿会员中个位数为6的有1e8个,所以我们将总数设为1.1e9个, //如果抽中的数x大于1e9,相当于抽中个位数为6的数y=((x-1e9-1)*10+6)。 //抽中每个人的概率为1/1.1e9, //rand()取值为0~1023,如果取值超过1000则重新取值,所以可以随机取值0~999. //用3个rand(),然后1.1e6*rand()+1e3*rand()+rand(), //可以得到0~1.1e9之间的随机值。 int Rand(void) { int ret; return (ret = rand()) >= 1000 ? Rand() : ret; } //抽取一次 int ExtraceOnce(void) { int num; num = 1.1e6*Rand()+1e3*Rand()+Rand(); if(num > 1e9) num = (num - 1e9 - 1) * 10 + 6; return num; } void foo (void) { //set保存找到的值 hash_set<int> set; for(int i = 0; i < 1e6; ++i) { int num = ExtraceOnce(); //避免重复 while(set.find(num) != set.end()) num = ExtraceOnce(); set.insert(num); } }