根据权重产生随机数

假如一个抽奖如下信息

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()所产生的随机数值每次就会一样。

  1. 获得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 
#include 
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;
}

你可能感兴趣的:(算法)