代码改变世界

一个关于Random算法的问题

  只喝牛奶的杀手  阅读(1037)  评论(3编辑  收藏  举报

      指定范围数字,生成随机序列,数字不连续;例如:范围【1-5】  输入 1 3 5 2 4

      下面分享两种算法:

  算法1:RmNum<RmNext 下面这种算法计算是无压力的
/// <summary>
/// 指定范围数字 生成随机序列 数字不连续
/// </summary>
/// <param name="RmNum">随机序列个数</param>
/// <param name="RmNext">范围</param>
/// <returns></returns>
public static Dictionary<int, int> GetRandomList(int RmNum, int RmNext)
{
    Dictionary<int, int> dictionary = new Dictionary<int, int>();
    Random rm = new Random();
    for (int i = 0; dictionary.Count < RmNum; i++)
    {
        int nValue = rm.Next(1, RmNext);
        if (i == 0)
        {
            dictionary.Add(i, nValue);
        }
        if (!dictionary.ContainsValue(nValue))
        {
            ArrayList arrayList = new ArrayList();
            foreach (var item in dictionary)
            {
                arrayList.Add(item.Value);
            }
            if (dictionary.Count > 0)
            {
                if (Math.Abs(Convert.ToInt32(arrayList[arrayList.Count - 1]) - Convert.ToInt32(nValue)) > 1)
                {
                    dictionary.Add(i, nValue);
                }
            }
        }
    }
    return dictionary;
}

  

       算法2:RmNum<RmNext 下面这种算法,如果RmNum和RmNext趋近的时候就会出现效率问题(甚至计算不出来)

/// <summary>
/// 指定范围数字 生成随机序列 数字不连续
/// </summary>
/// <param name="RmNum">随机序列个数</param>
/// <param name="RmNext">范围</param>
/// <returns></returns>
public static List<int> GetRandomListNew(int RmNum, int RmNext)
{
    int[] array = new int[RmNext];
    List<int> List = new List<int>();
    for (int i = 0; i <= array.Length - 1; i++)
    {
        array[i] = i + 1;
        if (i == 0)
        {
            List.Add(array[i]);
        }
    }
    for (int i = 0; List.Count < RmNum; i++)
    {
        if (!List.Contains(List[List.Count - 1]))
        {
            if (List.Count > 0)
            {
                if (Math.Abs(Convert.ToInt32(List[List.Count - 1]) - Convert.ToInt32(List[List.Count])) > 1)
                {
                    List.Add(List[List.Count - 1]);
                }
            }
        }
    }
    return List;
}

  当RmNum=RmNext 时候,两种算法都会计算很长时间,甚至计算不出来,当时试着用hashtable,hashtable 可以存储但是是无序的,于是就用了Dictionary和list。

      下面是调用的方法(直接粘过去是能用的):

Stopwatch sp = new Stopwatch();
sp.Start();//开始计时
foreach (var item in GetRandomList(9999, 10000))
{
    Console.WriteLine(string.Format("{0}", item.Value.ToString()));
}
sp.Stop();
Console.WriteLine(String.Format("耗时{0}", sp.ElapsedMilliseconds));
Console.Read();

  

     指定范围数字,生成随机序列,数字不连续,我这个只是随机把一种组合打印出来,如果把所有组合都打印出来该怎么办???范围【1-5】   1 5 2 然后是不是就死循环了?

    求大神解惑!!!

  

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示