随机函数是产生随机数的函数。即以等概率产生某一范围(认为规定)内的任意数。例如,产生1~10范围内的整数,随机函数每次都以10%的概率产生1,2,3,……,10中的任何一个数。
概率随机数:是在1-10内产生随机数,但是每个数生成的概率不同。例如1-9概率为10%,10的概率是%90;
一,问题模拟:
比如:求1-5的数指定概率下的随机,概率如下:
数字 | 概率 |
---|---|
1 | 10% |
2 | 10% |
3 | 10% |
4 | 20% |
5 | 50% |
二,方法设想:
1, 将每个数按照概率占比放到一个数组中(比如:[1,2,3,4,4,5,5,5,5] ),然后求【0~数组长度】的随机数,所求值再取其数组值,即为所求;
2, 将指定概率作为权值添加到一个数组
- 将指定概率作为权值添加到一个数组:arr;
- 求数组arr中的所有数值的和:total ;
-
求 [0-total]中间的随机数:r;
- 找这个随机数r的在数组arr哪个arr[i] 中,然后返回这个:i。
- 使用这个i解决问题(比如上述问题:i+1即为所求)
三,代码实现:
class Program
{
static void Main(string[] args)
{
// 概率数组
int[] arr = new int[] { 10, 10, 10, 20, 50 };
Console.WriteLine("概率随机数~");
Console.WriteLine("随机到的索引:"+ ProbabilityRandomRumber(arr));
}
/// <summary>
/// 概率随机数
/// </summary>
/// <param name="rate"></param>
/// <returns></returns>
public static int ProbabilityRandomRumber(int[] rate)
{
int total = 0;
for (int i = 0; i < rate.Length; i++)
{
total += rate[i];
}
Random myRandom = new Random();
int r = myRandom.Next(0, total);
Console.WriteLine("随机数是:" + r);
int t = 0;
for (int i = 0; i < rate.Length; i++)
{
t += rate[i];
if (r < t)
return i;
}
return 0;
}
}