增加、减少随机抽中几率——此算法可用于题库随机抽题、赌博机控制出彩率,甚至俄罗斯方块等游戏,有广泛的用途!也希望能帮得到你!
强调
在随机的基础上增控制抽中几率,注意随机性!!
正文
一、文字解说:
为待随机抽取的集合每个项加一个权值,这个权值就是随机几率,比如正常被抽正的几率为1,那么将希望被抽中几率更大的项的权值设置为3或5,然后随机抽取集合中的项,并将随机数乘以每个项对应的权值,然后排序!!提取前N个项即可!大家可以发现权值更高被乘之后有更高几率排在前面而被抽中,如果将权值设为0将永远也不会被抽中!
二、应用场景:
1. 随机抽题:如果题A去年考过了,那么我希望今年出现的几率更小或者不出现,那么我将题A的权值设置为0,这道题将在以后的考试随机抽题中永远不会被随机抽中;而另外题B是本院今年模拟考试中的一道题目,我将这道题权值增加到5,根据算法,那么这道题目在下次随机抽题抽中率将比普通题目提高数倍!
2. 赌博机:大家知道游戏厅里面的赌博机是可以调的,被人调了之后出彩率明显提高或者降低,我觉得本算法适合解释。假设赌博机有24个赌项可供选择,分别是A-Z各个字母,按正常几率的话每个项的权值都是1,调机师可以通过动态改变权值来达到提高或降低中奖率。假如你投三个币,分别选了A、B、C,赌博机根据调机师的设置动态改变了A、B、C的权值,让灯转3-4圈后更大的几率停留在这三个选择中奖金较少的一个。
3. 俄罗斯方块:大家在打QQ俄罗斯方块对打的时候,有时候明显感觉堆得越高,出的东西反而不顺意,我觉得本算法也可以达到这个效果。计算机能算得出下一个最优方案是出条还是出角最好,所以可以通过调整权值来打破平均出现的几率来达到这个目的!
三、代码实现(C#实现):
RandomController.cs
using System;
using System.Collections.Generic;
using System.Text;
/*
为待随机抽取的集合每个项加一个权值,这个权值就是随机几率,比如正常被抽正的几率为1,
那么将希望被抽中几率更大的项的权值设置为3或5,然后随机抽取集合中的项,并将随机数
乘以每个项对应的权值,然后排序!!提取前N个项即可!大家可以发现权值更高被乘之后
有更高几率排在前面而被抽中,如果将权值设为0将永远也不会被抽中!
*/
namespace 随机抽奖
{
public class RandomController
{
#region Properties
private int _Count;
/// <summary>
/// 随机抽取个数
/// </summary>
public int Count
{
get{return _Count;}
set{_Count = value;}
}
#endregion
#region Member Variables
/// <summary>
/// 待随机抽取数据集合
/// </summary>
public List<char> datas = new List<char>(
new char[]{
'A','B','C','D','E','F',
'G','H','I','J','K','L',
'M','N','O','P','Q','R',
'S','T','U','V','W','X',
'Y','Z'
});
/// <summary>
/// 对应奖项权值
/// </summary>
public List<ushort> weights = new List<ushort>(
new ushort[]{
1,2,3,4,5,6,
7,8,9,0,1,1,
1,1,1,1,1,1,
1,1,1,1,1,1,
1,1
});
#endregion
/// <summary>
/// 构造函数
/// </summary>
/// <param name="count">随机抽取个数</param>
public RandomController(ushort count)
{
if (count > 26)
throw new Exception("抽取个数不能超过数据集合大小!!");
_Count = count;
}
#region 普通随机抽取
/// <summary>
/// 随机抽取
/// </summary>
/// <param n