最近有一个需求,C# 自带的随机数生成多个随机数时,相邻的两个随机数的值的跨度比较大,对于模拟数据不是太合理。
例如:如果模拟温度的话,设置了最低温度和最高温度之后,温度是慢慢变化的
代码如下:
/*
说明: 生成线性随机数 C# Smooth Random Number
使用方法:
初始化:
RandHelper.Reset();
RandHelper.Reset(1, 10);
循环中调用:
RandHelper.Get(1,10);
作者: zomoon.com contact@zomoon.com
*/
using System;
public class RandHelper
{
//随机数种子
private static Random rd = new Random();
//使用集合记录上一个值的大小,新生成的值根据上一个值来生成
private static System.Collections.Concurrent.ConcurrentDictionary<string, decimal> rands = new System.Collections.Concurrent.ConcurrentDictionary<string, decimal>();
/// <summary>
/// 生成随机数
/// </summary>
/// <param name="min">最小值</param>
/// <param name="max">最大值</param>
/// <returns></returns>
public static decimal Get(int min, int max)
{
//判断最小值和最大值是否合理
if (min >= max)
{
max = min + 1;
}
//初始化或者获取上一条数据
decimal value = 0M;
if (rands.ContainsKey($"{min}-{max}"))
{
value = rands[$"{min}-{max}"];
}
else
{
value = (decimal)rd.Next(min, max);
rands.TryAdd($"{min}-{max}", value);
}
//生成新的数据, 取-1到1的随机数,可以通过这里调整线性数的大小
value += (decimal)rd.Next(-10, 10) / 10;
//判断新值的合理性
if (value < min)
value = (decimal)min;
if (value > max)
value = (decimal)max;
rands[$"{min}-{max}"] = value;
return value;
}
/// <summary>
/// 清空所有状态
/// </summary>
public static void Reset()
{
rands.Clear();
}
/// <summary>
/// 清空单个状态
/// </summary>
/// <param name="min">最小值</param>
/// <param name="max">最大值</param>
public static void Reset(int min, int max)
{
if (rands.ContainsKey($"{min}-{max}"))
{
decimal d;
rands.TryRemove($"{min}-{max}", out d);
}
}
}
运行结果,最小值10,最大值20 :
17.6
18.4
17.9
18.7
17.8
16.9
16.1
15.7
15.7
15.4
15.8
16.4
17.1
17.3
17.0
17.4
18.2
17.9
18.5
18.4
18.9
18.7
18.2
17.2
17.4
17.5
16.6
17.4
18.0
18.4
18.8
17.9
使用逐梦免费表格,在线设计表格,下发多部门,多部门填报,汇总报表
https://zomoon.com/cn
浙公网安备 33010602011771号