写在前面

前天去面试了,给出的笔试中有这样的一道算法题,产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复

当时,脑子一热,也没想那么多,就用集合实现了一下,经面试官提醒,发现还有更好的方式来实现。

代码

首先看一下这样一段代码

 1 namespace Wolfy.RandomDemo
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             List<int> lst = new List<int>();
 8             Random r = new Random();
 9             while (true)
10             {
11                 int temp = r.Next(1, 101);
12                 if (lst.Count == 100)
13                 {
14                     break;
15                 }
16                 if (!lst.Contains(temp))
17                 {
18                     lst.Add(temp);
19                 }
20             }
21             for (int i = 0; i < lst.Count; i++)
22             {
23                 Console.WriteLine(lst[i]);
24             }
25             Console.Read();
26         }
27     }
28 }

虽然上面的代码,实现题目的要求,但是如果是1到100万或者更大,这样的每次判断是否包含这样的一个数,势必会影响到性能。

网上找到一种更好的实现方式:

(1)把N个数放到容器A(int数组)中.

(2)从N个数中随机取出1个数放入容器B(int数组)中.

(3)把容器A中最后一个数与随机抽取的数对调 或者 把容器A中最后一个数覆盖随机抽取出来的数.

(4)这时从容器A(假设N个数,索引0 到 索引N-2)之间随机取一个数.再放入容器B中,重复此步骤.

说明:也就是第二次是从容器A中 第一个元素到倒数第二个元素 中随机取一个数.

这种好处是,随机数所取范围逐步缩小,而且杜绝了大数据时集合执行删除操作时产生的瓶颈.

代码实现

 1 namespace Wolfy.RandomDemo
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             int[] result = GetRandom(100);
 8             for (int i = 0; i < result.Length; i++)
 9             {
10                 Console.WriteLine(result[i]);
11             }
12             Console.WriteLine("over:" + result.Length);
13             Console.Read();
14         }
15         /// <summary>
16         /// 获得无重复随机数组
17         /// </summary>
18         /// <param name="n">上限n</param>
19         /// <returns>返回随机数组</returns>
20         static int[] GetRandom(int n)
21         {
22             //容器A和B
23             int[] arryA = new int[n];
24             int[] arryB = new int[n];
25             //填充容器a
26             for (int i = 0; i < arryA.Length; i++)
27             {
28                 arryA[i] = i + 1;
29             }
30             //随机对象
31             Random r = new Random();
32             //最后一个元素的索引 如n=100,end=99
33             int end = n - 1;
34             for (int i = 0; i < n; i++)
35             {
36                 //生成随机数 因为随机的是索引 所以从0到100取,end=100
37                 //一个大于等于 minValue 且小于 maxValue 的 32 位带符号整数,即:返回的值范围包括 minValue 但不包括 maxValue。
38                 //如果 minValue 等于 maxValue,则返回 minValue
39                 //
40                 int minValue = 0;
41                 int maxValue = end + 1;
42                 int ranIndex = r.Next(minValue, maxValue);
43                 //把随机数放在容器B中
44                 arryB[i] = arryA[ranIndex];
45                 //用最后一个元素覆盖取出的元素
46                 arryA[ranIndex] = arryA[end];
47                 //缩减随机数生成的范围
48                 end--;
49             }
50             //返回生成的随机数组
51             return arryB;
52         }
53     }
54 }

总结

实现方式有很多种,但是如果能用高效的方式就用高效的方式实现。这种生成无重复的随机数,可以在运用在抽奖系统中。

转载于:https://www.cnblogs.com/wolf-sun/p/4321609.html

产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复相关推荐

  1. java长度为100的数组_产生一个int数组,长度为100,并向其中随机插入1-100,不重复...

    #define RANDOM(X) (rand() % X + 1) int main() { //标志数组 int book[] = {}; int result[] = {}; //默认的随机数种 ...

  2. 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。

    产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复. int[] intArr=new int[100]; ArrayList myList=new ArrayList(); ...

  3. 请编程实现:产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复(百度了一下,get一种高性能算法,非递归)...

    网上找到一种更好的实现方式: (1)把N个数放到容器A(int数组)中. (2)从N个数中随机取出1个数放入容器B(int数组)中. (3)把容器A中最后一个数与随机抽取的数对调 或者 把容器A中最后 ...

  4. Scanner读取一个int数组

    Scanner读取一个int数组 因为有段时间用C,以为当sc.hasNextInt()这种输入检测遇到回车符时会返回false,哪知道sc.hasNextInt()会忽略忽略一切空白符(包含回车符) ...

  5. 判断一个int数组中的元素是否存在重复

    package com.hbut.test2; import java.util.ArrayList; import java.util.HashSet; import java.util.List; ...

  6. int java 声明_怎样用java定义一个int数组 C++ 怎么声明一个整型数组?

    导航:网站首页 > 怎样用java定义一个int数组 C++ 怎么声明一个整型数组? 怎样用java定义一个int数组 C++ 怎么声明一个整型数组? 相关问题: 匿名网友: int[] anA ...

  7. java定义int数组_怎样用java定义一个int数组

    展开全部 数组:是一组相关变量的集合数组是一组相关数据的集合,一个数组实际上就是32313133353236313431303231363533e4b893e5b19e31333363373731一连 ...

  8. leetcode:java.T018_4Sum---给定一个整数数组,找出a + b + c + d = target的唯一解,不能有重复元素组

    <span style="color:#ff4635">敬请关注博客,后期不断更新优质博文,谢谢</span> package leetcode.T018_ ...

  9. java出现次数最多的数_java如何找出一个int数组中出现次数最多

    展开全部 其实这个问题,涉及到两个过程首先是统计数组中数字出现的次数,应该要有类32313133353236313431303231363533e78988e69d8331333365636666似& ...

最新文章

  1. ​Nature子刊:中德合作发现玉米根系与根际有益微生物互惠关键生物学机制
  2. springmvc如何访问静态文件,例如jpg,js,css
  3. 软件项目版本号的命名格式
  4. 向Java添加@atomic操作
  5. MOSS服务器场迁移1-有关切换登录用户时需要刷新一次才能成功的问题
  6. cas-client 使用(6)
  7. all方法 手写promise_我团队的一年前端实现Promise所有方法
  8. python基础(2)
  9. getElementByID() getElementsByName() getElementsByTagName()的区别 .
  10. 【实战】Vue 中 Props 值因异步获取导致的报错问题解析
  11. 数库“SmarTag”数据体系正式登陆Factset另类数据市场
  12. 35道常见的前端vue面试题
  13. 云服务器搭建Hadoop集群
  14. 表达式类型错误oracle,这个语句报pls_00382 表达式类型错误 求问为什么。
  15. vue实现数字翻页动画
  16. Linux环境安装+阿里云+jdk8
  17. html大段文本如何分页,打印大型HTML表时如何处理分页符
  18. php 验证 繁体,验证码上中文字是繁体
  19. MobaXterm Professional v11.1 Build 3860 注册版-全功能SSH/X远程客户端-Xmanager最佳替代品
  20. Greenplum数据库数据分片策略Hash分布——GUC gp_use_legacy_hashops

热门文章

  1. 监控工具—Prometheus—基础介绍
  2. Scala 读取文件
  3. robot framework数据库操作
  4. CI框架源码阅读笔记4 引导文件CodeIgniter.php
  5. ActiveMQ持久化到mysql
  6. Class NPOI
  7. matlab中特殊符号如希腊字符
  8. sprint2第三天任务完成情况
  9. 【python 3.6】python读取json数据存入MySQL(一)
  10. ubuntu-14.04.2-desktop-i386.iso:ubuntu-14.04.2-desktop-i386:安装Oracle11gR2