C# 有一组数,每个数出现的概率不同,如何从这组数中随机抽出几个数,怎么实现?
答案:1 悬赏:60 手机版
解决时间 2021-03-13 17:44
- 提问者网友:雾里闻花香
- 2021-03-13 11:17
现在有一个集合,里面有1~10这十个确定的数字,对应每个数字的出现概率分别为:0.01,0.04,0.05, 0.1, 0.15,0.15,0.15,0.15,0.1,0.05,0.04,0.01 。如何实现按照上述概率,从这个集合中随机的抽取,不重复的5个数? 要求C# 实现!谢谢!!
最佳答案
- 五星知识达人网友:话散在刀尖上
- 2021-03-13 11:41
static void Main(string[] args)
{
Dictionary<int, double> setting = new Dictionary<int, double>();
setting.Add(1, 0.01);
setting.Add(2, 0.04);
setting.Add(3, 0.05);
setting.Add(4, 0.1);
setting.Add(5, 0.15);
setting.Add(6, 0.15);
setting.Add(7, 0.15);
setting.Add(8, 0.15);
setting.Add(9, 0.1);
setting.Add(10, 0.05);
setting.Add(11, 0.04);
setting.Add(12, 0.01);
List<int> list = getRandNumList(setting, 5);
}
/// <summary>
/// 获取若干个不同随机数字
/// </summary>
/// <param name="setting">数字与出现概率的配置</param>
/// <param name="num">获取数字个数</param>
/// <returns></returns>
static List<int> getRandNumList(Dictionary<int, double> setting, int num)
{
List<int> ret = new List<int>();
for (int i = 0; i < num; i++)
{
if (setting.Count <= 0) break;
int getKey = getRandNum(setting); //获取单个随机数字
setting.Remove(getKey); //从配置里去掉对应数字
ret.Add(getKey); //记录获取的数字
System.Threading.Thread.Sleep(100); //随机数并不随机,不加这个随机数会比较连续
}
return ret;
}
/// <summary>
/// 获取单个随机数字
/// </summary>
/// <param name="setting">数字与出现概率的配置</param>
/// <returns></returns>
static int getRandNum(Dictionary<int, double> setting)
{
double total = 0;
foreach (int key in setting.Keys)
{
total += setting[key]; //计算总概率值
}
Random rand = new Random();
double r = rand.NextDouble() * total; //取一个随机数,乘以总概率值,映射到总概率值的区间内
total = 0;
foreach (int key in setting.Keys)
{
total += setting[key]; //按顺序累加概率值
if (total > r) //如果前面随机的数在对应区间内,则返回该数
{
return key;
}
}
return setting.Keys.Last<int>(); //返回最后一个数,对应rand.NextDouble()随机到1.0的情况
}
{
Dictionary<int, double> setting = new Dictionary<int, double>();
setting.Add(1, 0.01);
setting.Add(2, 0.04);
setting.Add(3, 0.05);
setting.Add(4, 0.1);
setting.Add(5, 0.15);
setting.Add(6, 0.15);
setting.Add(7, 0.15);
setting.Add(8, 0.15);
setting.Add(9, 0.1);
setting.Add(10, 0.05);
setting.Add(11, 0.04);
setting.Add(12, 0.01);
List<int> list = getRandNumList(setting, 5);
}
/// <summary>
/// 获取若干个不同随机数字
/// </summary>
/// <param name="setting">数字与出现概率的配置</param>
/// <param name="num">获取数字个数</param>
/// <returns></returns>
static List<int> getRandNumList(Dictionary<int, double> setting, int num)
{
List<int> ret = new List<int>();
for (int i = 0; i < num; i++)
{
if (setting.Count <= 0) break;
int getKey = getRandNum(setting); //获取单个随机数字
setting.Remove(getKey); //从配置里去掉对应数字
ret.Add(getKey); //记录获取的数字
System.Threading.Thread.Sleep(100); //随机数并不随机,不加这个随机数会比较连续
}
return ret;
}
/// <summary>
/// 获取单个随机数字
/// </summary>
/// <param name="setting">数字与出现概率的配置</param>
/// <returns></returns>
static int getRandNum(Dictionary<int, double> setting)
{
double total = 0;
foreach (int key in setting.Keys)
{
total += setting[key]; //计算总概率值
}
Random rand = new Random();
double r = rand.NextDouble() * total; //取一个随机数,乘以总概率值,映射到总概率值的区间内
total = 0;
foreach (int key in setting.Keys)
{
total += setting[key]; //按顺序累加概率值
if (total > r) //如果前面随机的数在对应区间内,则返回该数
{
return key;
}
}
return setting.Keys.Last<int>(); //返回最后一个数,对应rand.NextDouble()随机到1.0的情况
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯