zomoon.com 逐梦免费表格
使用逐梦免费表格,在线设计表格,下发多部门,多部门填报,汇总报表

最近有一个需求,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

posted on 2020-04-17 10:45  zomoon逐梦免费表格  阅读(318)  评论(0)    收藏  举报