zoukankan      html  css  js  c++  java
  • 生成一定范围内的互不相同的随机数的方法比较

    实现原理:

    方法1:使用list,通过list.contains()作为循环判断的条件,实现无重复的add

    方法2:使用两组数组,all存储所有可取值,result存储结果,result依次从all中取值,all长度递减,通过索引实现all中始终保持取完后剩下的元素

    分析:法1在最坏情况下会重复循环,法2通过保证每次都能取到值,很大程度上提高了效率

    代码比较:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    
    namespace 基本语法
    {
        class Program
        {
            static void Main(string[] args)
            {
                Stopwatch watch = new Stopwatch();
                watch.Start();
                List<int> list = _GetRandom(20, 500, 400);
                watch.Stop();
                int ctrl = 0;
                foreach (int i in list)
                {
                    Console.Write("{0} ", i);
                    ++ctrl;
                    if (ctrl % 20 == 0)
                        Console.WriteLine();
                }
                Console.WriteLine("\nMethod 1 time used:{0}", watch.Elapsed);
    
                watch.Reset();
                watch.Start();
                int[] ia = GetRandom(20, 500, 400);
                watch.Stop();
                ctrl = 0;
                foreach (int i in ia)
                {
                    Console.Write("{0} ", i);
                    ++ctrl;
                    if (ctrl % 20 == 0)
                        Console.WriteLine();
                }
                Console.WriteLine("\nMethod 2 time used:{0}", watch.Elapsed);
            }
            /// <summary>
            /// 使用list容器产生一定范围内互不相同的随机数
            /// </summary>
            /// <param name="minVal">最小值</param>
            /// <param name="maxVal">最大值</param>
            /// <param name="amount">随机数总数</param>
            /// <returns>返回list<int></returns>
            static List<int> _GetRandom(int minVal, int maxVal, int amount)
            {
                List<int> list = new List<int>();
                while (list.Count != amount)
                {
                    Random random = new Random((int)DateTime.Now.Ticks);
                    int temp = random.Next(minVal, maxVal);
                    if (!list.Contains(temp))
                        list.Add(temp);
                }
                return list;
            }
    
            /// <summary>
            /// 使用数组方法实现
            /// </summary>
            /// <param name="minVal"></param>
            /// <param name="maxVal"></param>
            /// <param name="amout"></param>
            /// <returns>返回int[]</returns>
            static int[] GetRandom(int minVal, int maxVal, int amout)
            {
                int[] result = new int[amout];
                int[] all = new int[maxVal-minVal+1];
                for (int ix = 0; ix!=amout;++ix )
                {
                    all[ix] = minVal + ix;
                }
                Random random = new Random();
                int allNum = all.Length;
                for (int ix = 0; ix != amout;++ix )
                {
                    int index=random.Next(allNum);
                    result[ix] = all[index];
                    all[index] = all[--allNum];
                }
                return result;
            }
        }
            
    }

    运行结果:

    方法1在很多情况下耗时根本无法接受。。。

  • 相关阅读:
    Verilog非阻塞赋值的仿真/综合问题 (Nonblocking Assignments in Verilog Synthesis)上
    异步FIFO结构及FPGA设计 跨时钟域设计
    FPGA管脚分配需要考虑的因素
    An Introduction to Delta Sigma Converters (DeltaSigma转换器 上篇)
    An Introduction to Delta Sigma Converters (DeltaSigma转换器 下篇)
    中国通信简史 (下)
    谈谈德国大学的电子专业
    中国通信简史 (上)
    Verilog学习笔记
    Verilog非阻塞赋值的仿真/综合问题(Nonblocking Assignments in Verilog Synthesis) 下
  • 原文地址:https://www.cnblogs.com/leowww/p/3089715.html
Copyright © 2011-2022 走看看