如何使用 C# 生成随机并唯一的数字?

咨询区

  • Christian Peut

我的项目中需要生成若干个并且唯一的随机数,我用的是 System.Random,种子给的是 DateTime.Now.Ticks ,参考如下代码:

private void NewNumber()
{Random a = new Random(DateTime.Now.Ticks.GetHashCode());MyNumber = a.Next(0, 10);
}

当我多次调用 NewNumber() 方法时,我发现会经常出现重复的值,一些朋友说是因为每次都 new 了一下 Random 所致,建议提取出来,代码如下:

public Random a = new Random(DateTime.Now.Ticks.GetHashCode());
private void NewNumber()
{MyNumber = a.Next(0, 10);
}

虽然随机性达到了,但我发现还是会存在 重复 的情况,请问是否有更好的解决方法。

回答区

  • tsme86

如果你仅仅是需要在  0-9 之间做 随机唯一 的话,我建议你用 洗牌策略 来打乱数组元素即可,参考如下代码:

static void Main(string[] args){var nums = Enumerable.Range(0, 10).ToArray();var rnd = new Random();// Shuffle the arrayfor (int i = 0; i < nums.Length; ++i){int randomIndex = rnd.Next(nums.Length);int temp = nums[randomIndex];nums[randomIndex] = nums[i];nums[i] = temp;}// Now your array is randomized and you can simply print them in orderfor (int i = 0; i < nums.Length; ++i)Console.WriteLine(nums[i]);}
  • JOSEFtw

如果你的生成范围小,我建议你用 Guid.NewGuid() 来实现随机性,但范围大的话,我不建议使用,因为性能是真的很差,参考代码如下:

static void Main(string[] args){var result = Enumerable.Range(0, 9).OrderBy(g => Guid.NewGuid()).ToArray();for (int i = 0; i < result.Length; ++i)Console.WriteLine(result[i]);}
  • Vasily Novsky

我是借用 HashSet 来找到 N 个随机并唯一的数字,道理很简单,HashSet 本身就可以保证数字的唯一性,参考如下代码:

using System;
using System.Collections.Generic;namespace ConsoleApplication1
{class RnDHash{static void Main(){HashSet<int> rndIndexes = new HashSet<int>();Random rng = new Random();int maxNumber;Console.Write("Please input Max number: ");maxNumber = int.Parse(Console.ReadLine());int iter = 0;while (rndIndexes.Count != maxNumber){int index = rng.Next(maxNumber);rndIndexes.Add(index);iter++;}Console.WriteLine("Random numbers were found in {0} iterations: ", iter);foreach (int num in rndIndexes){Console.WriteLine(num);}Console.ReadKey();}}
}

点评区

从时间复杂度以及条件允许的情况下,我觉得 洗牌策略 是一个好方案,其次是 HashSet,最后是 Guid.NewGuid(),这题目相信能给大家提供好的思路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python环境搭建与连接SQL Server类MyDBase的实现

一、开发环境搭建 1、下载所需版本的软件包(点击下载),点击安装即可,注意x86与x64的选择。 2、配置环境:复制python安装目录,粘贴到Path中 3、打开cmd,输入python并回车,看到如下信息,则安装成功!

如何隐藏地址栏中的真实地址_Firefox推出Private Relay插件:可隐藏真实邮箱地址...

Mozilla 正在为 Firefox 开发一项名为Private Relay 的新服务&#xff0c;它能够用来一键随机生成电子邮件别名&#xff0c;以隐藏真实邮箱地址&#xff0c;使用户免受广告商和垃圾邮件侵害。Private Relay 将作为 Firefox插件提供。它于上个月开始测试&#xff0c;目前仍处于封…

使用VS开发C++ 控制台程序或其他项目出现 ‘ LINK : fatal error LNK1104: 无法打开文件“LIBCD.lib” ’ 常规解决办法

原因&#xff1a;大多是由低版本例如VC6(本人是)开发项目&#xff0c;然后在高版本上再开发该项目导致LIBCD.lib出现更改由此出现错误提示。 本人VS版本2017&#xff1b; 一般解决办法&#xff1a; 第一步&#xff1a;右键项目属性 第二步&#xff1a;在忽略特定库位置加上要忽…

linux算法设计,嵌入式Linux平台下随机序列算法设计.doc

嵌入式Linux平台下随机序列算法设计嵌入式Linux平台下随机序列算法设计【摘 要】本文以多媒体播放器的随机不重复播放机能为切入点&#xff0c;针对嵌入式平台实时性要求高&#xff0c;处理速度不够快&#xff0c;但系统存储歌曲量大的特点&#xff0c;进行随机序列产生算法的设…

解决windows系统80端口被占用问题

在windows下部署web应用(80端口)&#xff0c;启动时提示bind 80端口失败 检查端口占用&#xff1a; netstat -ano | findstr 0.0.0.0:80 发现System进程 (pid4) 占用了端口 然而本机也没有安装iis&#xff0c;于是排除IIS服务的问题。解决方式 管理员身份运行cmdnet stop http …

[MySQL] 分组排序取前N条记录以及生成自动数字序列,类似group by后 limit

前言&#xff1a;同事的业务场景是&#xff0c;按照cid、author分组&#xff0c;再按照id倒叙&#xff0c;取出前2条记录出来。oracle里面可以通过row_number() OVER (PARTITION BY cid,author ORDER BY id DESC) 表示根据cid,author分组&#xff0c;在分组内部根据id排序&…

picturebox 图片自适应

picturebox控件共有两种载入图片方式&#xff0c;分别为&#xff1a; pictureBox1.BackgroundImage Image&#xff0c;pictureBox1.load(url) 为使加载的图片自使用控件尺寸&#xff0c;可以分别对pictureBox控件设置BackGroundImageLayoutStretch&#xff0c;SizeModeStretch…

编译C程序提示之'for' loop initial declaration used outside C99 mode

1 问题 再gcc编译一个c程序的时候&#xff0c;错误提示如下 for loop initial declaration used outside C99 mode 2 原因 c99是允许在for循环中声明变量的&#xff0c;但是如果使用的标准为c99之下的话&#xff0c;则不允许这么做&#xff0c;这里我是在for循环里面定义了变…

不同步节点在线使用Remix开发以太坊Dapp及solidity学习入门 ( 一 ):智能合约HelloWorld

有问题可以点击–>加群互相学习 本人本来想自己写公链&#xff0c;结果发现任重道远&#xff1b; 遂&#xff0c;开始写Dapp&#xff0c;顺便写的时候搞个教程吧。。。 通过系列教程学习将会&#xff1a; 1.基本使用solidity 语言开发智能合约 2.知道怎么发自己的以太坊的to…

Blazor University (16)渲染树 — 使用 @key 优化

原文链接&#xff1a;https://blazor-university.com/components/render-trees/optimising-using-key/使用 key 优化源代码[1]提示&#xff1a; 对于在运行时循环生成的组件&#xff0c;始终使用 key。前面的示例运行良好&#xff0c;因为 Blazor 能够轻松地将虚拟 DOM 元素与浏…

Python趣味编程---Python也会讲笑话

笑话从哪里来?自己写肯定是不现实的。在这个“云”的时代,各种云都有,自然是不缺开放API的(大部分都是免费的)。随意一搜,果然被我找到一个接口:易源_笑话大全http://apistore.baidu.com/apiworks/servicedetail/864.html。下面写一个用Python写的例子,其实不止python语…

python闭环最短路径_深度学习经典算法 | 蚁群算法解析

蚁群算法基本思想蚁群算法的基本原理来源于自然界中蚂蚁觅食的最短路径问题。根据昆虫学家的观察&#xff0c;发现自然界的蚂蚁虽然视觉不发达&#xff0c;但它可以在没有任何提示的情况下找到从食物源到巢穴的最短路径&#xff0c;并且能在环境发生变化(如原有路径上有了障碍物…

c语言整形除法是五舍六入吗,四舍六入五成双 - C/C++论坛 - 51CTO技术论坛_中国领先的IT技术社区...

复制内容到剪贴板代码:#includeusing namespace std;#define FLENGTH 1000; //宏定义保留3位小数double fun(double ldBuf); //四舍六入五成双函数int main(void){double ldTemp9.824963;double ldRet;//大于5ldTemp9.824963;ldRet fun(ldTemp);printf("%.…

苹果的热榜:积分墙背后的隐秘世界

电影《楚门的世界》中描述过这样的故事&#xff1a;楚门这个快乐单纯的青年&#xff0c;一直以为自己是平凡小镇上普通的保险推销员。直到有一天他发现这世界上的一切都是为他精心安排的。他会遇到谁、在他身上将要发生什么事件&#xff0c;都是按照剧本被人操纵的。甚至连他的…

剑指offer之字符串的全排列

1 问题 求字符串的全排列&#xff0c;比如字符串abc&#xff0c;它的全排列如下 abc, acb, bac, bca, cad, cba 2 思路 我们先固定第一个字符&#xff0c;这里的第一个字符肯定是这个字符串里面字符串的全子集&#xff08;不包含重复&#xff09;&#xff0c;abc字符串&…

OC基础学习

1.OC简介 ➢ C语言的基础上&#xff0c;增加了一层最小的面向对象语法 ➢ 完全兼容C语言 ➢ 可以在OC代码中混入C语言代码&#xff0c;甚至是C代码 ➢ 可以使用OC开发Mac OS X平台和iOS平台的应用程序 2.OC关键字 ➢ 基本上所有关键字都是以开头 ➢ 下面列举一些常见的关键字&a…

关中断是否禁止任务调度?关中断能作为互斥吗?

本文引自链接http://www.52rd.com/Blog/Detail_RD.Blog_imjacob_16830.html?WebShieldDRSessionVerifyCOR6tnpfsOXExxEAO6Z6 今天再看《嵌入式软件系统教程》&#xff08;&#xff08;美&#xff09;西蒙 著&#xff0c;陈向群 等译&#xff09; &#xff0c;里面讲到关中断会…

solidity编写eth智能合约之contract 创建合约(二)

环境说明&#xff1a; Ide&#xff1a;在线remix Solidity IDE 语言&#xff1a;solidity solidity 版本号&#xff1a;0.4.20 Tip&#xff1a;如果一点都不懂的建议从头开始看 运行结果截图我不赘述&#xff0c;所有合约代码均通过个人检测。请按照标准进行操作&#xff0c;如…

为什么HttpContextAccessor要这么设计?

前言周五在群里面有小伙伴问&#xff0c;ASP.NET Core这个HttpContextAccessor为什么改成了这个样子&#xff1f;在印象中&#xff0c;这已经是第三次遇到有小伙伴问这个问题了&#xff0c;特意来写一篇记录&#xff0c;来回答一下这个问题。聊一聊历史关于HttpContext其实我们…

AJAX与SQL Server(一)

本实例演示利用Ajax技术,通过asp文件,从SQL Server数据库中读取数据。 1、新建一个网站。 2、在网站目录下新建一个txt文档,改名为datasource.asp,内容为: <%@Language="vbscript" Codepage="65001"%> <% response.expires=-1 sql="…