概述
假如一个抽奖如下信息
int w_list[5] = { 20, 10, 40, 15, 15 };
string names[5] = { "电饭锅", "牙刷", "挨粪叉", "pier子", "蒸馍" };
对应权值 电饭锅–>20,牙刷–>10 以此类推,可见抽到挨粪叉的概率即权值最大
用C++ 实现
先或得随机数
1. 初始化随机数发生器
用法: void srand(unsigned int seed)
所在头文件: stdlib.h
srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
- 获得0–权重和 之内的随机数
int w_sum = 0;
int length = sizeof(w_list) / sizeof(int);
for (int i = 0; i < length; i++)
{
w_sum += w_list[i];
}
/*for (int i = 0; i < length; i++)
{
cout << "rand()-" << i << "-" << rand() % w_sum << endl;
}*/
int randVal = rand() % w_sum;
奖励
int rward
代表奖励的下标
int rward = 0;
for (int i = 0; i < length; i++)
{
if (randVal <= w_list[i])
{
rward = i;
break;
}
randVal -= w_list[i];
//printf("randVal = %d rward = %d n", randVal, rward);
}
//printf("length = %d w_sum = %d randVal = %d rward = %d n", length, w_sum, randVal, rward);
printf("恭喜获得一个%s", names[rward].c_str());
解释
首先设置各个奖励的权重,这里的权重之和不必非要是100,我的这段代码设置的权重之和位100,是为了方便读者了解到各个奖励抽中的概率,所以这样设置的,理论上说,数值大一点,产生的随机数更大,也更加随机。这里只将权重放大数组中,一般情况下,需要策划提供相关的配表,然后从配表中读取数值,这样,在应用中,可以通过跟新配表,来事实更新权重信息。由于通过配表设置了权重,所以,奖励种类不确定,因此,通过sizeof函数,获取数所占空间,然后,除以int所占内存空间,获得数组长度。然后,求权重总和,再调用自己创建的随机函数,产生随机数。下面就是判断这个随机数在那种奖励的权重范围了。将获取的随机送randVal和权重数组中的数进行比较,首先和a[0]作比较,加入获取的随机数是41,a[0]=5,41>a[0],那么,将41 - 5 等于36,继续和第二个数a[1]也就是10进行比较,36比10大,就减去10,变成26,然后继续和a[2]也就是15比较,还是大,就减去15变为16,然后和a[3] 也就是25比较,这时,比25小,也就是说,此时随机到了这个奖励
完整代码
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
srand((unsigned)time(NULL));
int w_list[5] = { 20, 10, 40, 15, 15 };
string names[5] = { "电饭锅", "牙刷", "挨粪叉", "pier子", "蒸馍" };
int w_sum = 0;
int length = sizeof(w_list) / sizeof(int);
for (int i = 0; i < length; i++)
{
w_sum += w_list[i];
}
int randVal = rand() % w_sum;
int rward = 0;
for (int i = 0; i < length; i++)
{
if (randVal <= w_list[i])
{
rward = i;
break;
}
randVal -= w_list[i];
}
printf("恭喜获得一个%s", names[rward].c_str());
getchar();
return 0;
}
最后
以上就是悲凉季节为你收集整理的根据权重产生随机数假如一个抽奖如下信息用C++ 实现奖励的全部内容,希望文章能够帮你解决根据权重产生随机数假如一个抽奖如下信息用C++ 实现奖励所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复