博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生成互不相同随机数的一种算法
阅读量:5939 次
发布时间:2019-06-19

本文共 3115 字,大约阅读时间需要 10 分钟。

 

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace RandTest{    class Program    {        static void Main(string[] args)        {            int m;            do            {                Console.WriteLine("请输入要产生随机数的数量(大于0的数字):");            } while (!int.TryParse(Console.ReadLine(), out m));            int limit;            do            {                Console.WriteLine("请输入随机数的最大范围(大于0的数字并且要大于要产生随机数的数量):");            } while (!(int.TryParse(Console.ReadLine(), out limit) && limit >= m));            RandomNumbers(m, limit);            Console.WriteLine();            genknuth(m, limit);            Console.WriteLine();            randselect(m, limit);            Console.WriteLine();            genshuf(m, limit);            Console.ReadKey();        }        ///         /// 产生0~limit(大于等于0少于limit)内的m个随机数        ///         /// 随机数的数量        /// 随机数的最大范围(limit>=m)        static void RandomNumbers(int m,int limit)        {            int[] temp = new int[limit];            for (int i = 0; i < limit; i++)                temp[i] = i;            int number = 0;            int count = 0;            Random rand = new Random();            for (int i = 1; i <= m; i++)            {                number = rand.Next() % limit;                while (temp[number] == -1)                {                    number = rand.Next() % limit;                }                Console.Write(temp[number] + "\t");                count++;                if (count % 10 == 0)                {                    Console.WriteLine(Environment.NewLine);                }                temp[number] = -1;            }        }        static void genknuth(int m, int limit)        {            int i;            Random d = new Random();            for (i = 0; i < limit; i++)                if (d.Next() % (limit - i) < m)                {                    Console.WriteLine(i);                    m--;                }        }        static void randselect(int m, int limit)        {            int r;            Random d = new Random();            if (m > 0)            {                r = d.Next() % limit;                if (r < m)                {                    Console.WriteLine(limit - 1);                    randselect(m - 1, limit - 1);                }                else                    randselect(m, limit - 1);            }        }        static void genshuf(int m, int limit)        {            int i, j;            int[] x = new int[limit];            for (i = 0; i < limit; i++)                x[i] = i;            Random d = new Random();            for (i = 0; i < m; i++)            {                j = d.Next(i, limit - 1);                int t = x[i]; x[i] = x[j]; x[j] = t;            }            for (i = 0; i < m; i++)                Console.WriteLine(x[i]);        }    }}

  refer to:

思考:该算法就是用空间来换时间,如果每次产生一个随机数都和前面产生的比较的话,将耗费大量的时间。这样产生的话 如果要产生的个数接近区间长度 那产生最后几个的时候可能会花很多很多时间。还有一种思路:可以先对区间内的数shuffle一下,然后需要多少个就去前多少个。shuffle有快速的算法

还有什么更好的,大家都说说哈O(∩_∩)O~ 

转载于:https://www.cnblogs.com/tewuapple/p/3185244.html

你可能感兴趣的文章
Oracle推出轻量级Java微服务框架Helidon
查看>>
密码概述
查看>>
autoconf,automake,libtool
查看>>
jQuery的技巧01
查看>>
基于泛型实现的ibatis通用分页查询
查看>>
gopacket 使用
查看>>
AlertDialog对话框
查看>>
我的友情链接
查看>>
linux安全---cacti+ntop监控
查看>>
鸟哥的linux私房菜-shell简单学习-1
查看>>
nagios配置监控的一些思路和工作流程
查看>>
通讯组基本管理任务三
查看>>
赫夫曼编码实现
查看>>
html页面显示div源代码
查看>>
基础复习-算法设计基础 | 复杂度计算
查看>>
debian、ubuntu系统下,常用的下载工具
查看>>
带以太网的MicroPython开发板:TPYBoardv201温湿度上传实例
查看>>
如何解压缩后缀名为zip.001,zip.002等的文件
查看>>
OSGI企业应用开发(十二)OSGI Web应用开发(一)
查看>>
Python 以指定概率获取元素
查看>>