在开发过程中,常常要产生随机数,如生成静态 html 网页时,文件名通常用产生随机数的方式获得,生成定单的时候,定单号也可以用产生随机数的方式获得等。

在 C# 中,一般都用 Random 产生随机数,它可任意指定产生随机数范围。Random 结合数组,可以产生一些特殊范围的随机数,以满足特殊的需要。如果在循环中产生随机数,由于间隔时间短,每次产生的随机数都一样,需要先生成种子(有 3 种方法),再用该种子产生随机数,或者锁住 Random 对象,这样才能减少产生随机数的重复率。如果要产生唯一的随机数(有 4 种方法),需要用数组或检查已产生随机数是否重复的办法。

一、用 Random 产生指定范围随机数(整数随机数)

1、产生指定上限的随机数(如产生100以内的随机数)

Random ran = new Random();

int n = ran.Next(100);

2、产生指定上下限的随机数(如产生100到1000的随机数)

Random ran = new Random();

int n = ran.Next(100, 1000);

二、用 Random 结合数组产生指定范围随机数(字符和布尔随机数)

在某些情况下,随机数只能取一些特殊指定的值,如不连续的数字或指定的一些单词等,此时仅用 Random 无法达到要求,必须借住数组才能实现。实现思路大概是这样:先把这些特殊的值存到数组中,然后把数组的长度作为 Random 的上限产生随机数,此随机数正是数组的下标,根据该下标取得数组的值。

(一)产生字符随机数

1、产生不连续或指定值的随机数

代码如下:

public string GetRandom(string[] arr)

{

Random ran = new Random();

int n = ran.Next(arr.Length - 1);

return arr[n];

}

调用方法:

string[] arr = { "25", "28", "30", "50", "60" };

GetRandom(arr);

2、生成保留指定小数位数(例如 2 位)的随机数

假如要用指定单词作为随机数的取值,代码实现跟上例相同,所不同的仅是随机数的取值,所以只要定义一个单词数组直接调用上面代码即可。

调用方法:

string[] arr = { "red", "green", "blue", "orange", "white" };

GetRandom(arr);

(二)产生布尔随机数

public bool GenerateBoolRandom()

{

bool[] arr = { true, false };

Random ran = new Random();

return arr[ran.Next(2)];

}

调用方法:

Response.Write(GenerateBoolRandom());// 结果 true

三、用 Random 产生小数随机数

在默认情况下,C# 只能产生任意小数随机数,如果要产生指定范围小数随机数,需要自己写代码。写代码时,既可以把它们封装到一个方法中又可以封装到一个类中,后者可重载 C# 的 NextDouble() 方法。

1、把代码封装到一个方法

A、生成小数随机数

public double NextDouble(Random ran, double minValue, double maxValue)

{

return ran.NextDouble() * (maxValue - minValue) + minValue;

}

调用:

Random ran = new Random();

double randNum = NextDouble(ran, 1.52, 2.65);

Response.Write(randNum);// 结果 2.30927768119112

B、生成保留指定小数位数(例如 2 位)的随机数

public double NextDouble(Random ran, double minValue, double maxValue, int decimalPlace)

{

double randNum = ran.NextDouble() * (maxValue - minValue) + minValue;

return Convert.ToDouble(randNum.ToString("f" + decimalPlace));

}

调用:

Random ran = new Random();

double randNum = NextDouble(ran, 5.16, 8.68, 2);// 保留两位小数

Response.Write(randNum);// 结果 8.46

2、把代码封装到一个类

代码:

using System;

using System.Text;

public static class RandomDoubleRange

{

public static double NextDouble(this Random ran, double minValue, double maxValue)

{

return ran.NextDouble() * (maxValue - minValue) + minValue;

}

public static double NextDouble(this Random ran, double minValue, double maxValue, int decimalPlace)

{

double randNum = ran.NextDouble() * (maxValue - minValue) + minValue;

return Convert.ToDouble(randNum.ToString("f" + decimalPlace));

}

}

调用:

Random ran = new Random();

double randNum1 = ran.NextDouble(5.16, 8.68);

double randNum2 = ran.NextDouble(5.16, 8.68, 2);//保留两位小数

Response.Write(randNum1 + "; " + randNum2);//结果 7.41055195257559; 6.69

四、产生相对不重复的随机数

当在一个循环中生成随机数,由于生成随机数的时间间隔比较短,容易产生重复的随机数,如果要产生不重复的随机数,需要用种子或把随机数对象锁住,以下是它们的实现方法。

1、用种子产生相对不重复的随机数

生成种子方法一:

public static int GenerateRandomSeed()

{

return (int)DateTime.Now.Ticks;

}

产生 1 到 10 的随机数为:2, 5, 2, 5, 7, 3, 4, 4, 6, 3

生成种子方法二:

using System.Text.RegularExpressions;

public static int GenerateRandomSeed()

{

return Convert.ToInt32(Regex.Match(Guid.NewGuid().ToString(), @"\d+").Value);

}

产生 1 到 10 的随机数为:1, 7, 4, 9, 8, 1, 8, 7, 9, 8

生成种子方法三:

using System.Security.Cryptography;

public static int GenerateRandomSeed()

{

byte[] bytes = new byte[4];

RNGCryptoServiceProvider rngCSP = new RNGCryptoServiceProvider();

rngCSP.GetBytes(bytes);

return BitConverter.ToInt32(bytes, 0);

}

产生 1 到 10 的随机数为:4, 8, 7, 2, 6, 7, 6, 5, 5, 7

产生指定数目的随机数并存到数组:

// randNum 为产生随机数的数目

public int[] GenerateRandom(int minValue, int maxValue, int randNum)

{

Random ran = new Random(GenerateRandomSeed());

int[] arr = new int[randNum];

for (int i = 0; i < randNum; i++)

{

arr[i] = ran.Next(minValue, maxValue);

}

return arr;

}

调用方法:

int[] arr = GenerateRandom(1, 10, 10);

string temp = string.Empty;

for (int i = 0; i < arr.Length; i++)

{

temp += arr[i].ToString() + ", ";

}

Response.Write(temp);

2、通过锁住 Random 对象产生相对不重复的随机数

产生随机数:

public int GenerateRandom(Random ran, int minValue, int maxValue)

{

lock (ran) // 锁住 Random 对象

{

return ran.Next(minValue, maxValue);

}

}

调用:

int[] arr = new int[5];

Random ran = new Random();

for (int i = 0; i < 5; i++)

{

arr[i] = GenerateRandom(ran, 1, 10);// 结果 5, 7, 2, 5, 2

}

五、生成绝对不重复的指定范围的随机数

1、方法一:先生成一个索引数组,再把产生的随机数作为索引从该数组中取一个数作为随机数。

生成随机数:

// n 为生成随机数个数

public int[] GenerateUniqueRandom(int minValue, int maxValue, int n)

{

//如果生成随机数个数大于指定范围的数字总数,则最多只生成该范围内数字总数个随机数

if (n > maxValue - minValue + 1)

n = maxValue - minValue + 1;

int maxIndex = maxValue - minValue + 2;// 索引数组上限

int[] indexArr = new int[maxIndex];

for (int i = 0; i < maxIndex; i++)

{

indexArr[i] = minValue - 1;

minValue++;

}

Random ran = new Random();

int[] randNum = new int[n];

int index;

for (int j = 0; j < n; j++)

{

index = ran.Next(1, maxIndex - 1);// 生成一个随机数作为索引

//根据索引从索引数组中取一个数保存到随机数数组

randNum[j] = indexArr[index];

// 用索引数组中最后一个数取代已被选作随机数的数

indexArr[index] = indexArr[maxIndex - 1];

maxIndex--; //索引上限减 1

}

return randNum;

}

调用方法:

GenerateUniqueRandom(1, 10, 10);// 结果 9, 5, 10, 1, 7, 3, 2, 4, 6, 8

GenerateUniqueRandom(1, 10, 5);// 结果 3, 7, 6, 1, 9

2、方法二:用 do...while 循环来生成不重复的随机数,用 for 循环来检查产生的随机数是否重复,只有不重复的随机数才保存到数组。

生成随机数:

// n 生成随机数个数

public int[] GenerateUniqueRandom(int minValue, int maxValue, int n)

{

// Random.Nex(1, 10) 只能产生到 9 的随机数,若要产生到 10 的随机数, maxValue 要加 1

maxValue++;

// Random.Nex(1, 10) 只能产生 9 个随机数,因此 n 不能大于 10 - 1

if (n > maxValue - minValue)

n = maxValue - minValue;

int[] arr = new int[n];

Random ran = new Random((int)DateTime.Now.Ticks);

bool flag = true;

for (int i = 0; i < n; i++)

{

do

{

int val = ran.Next(minValue, maxValue);

if (!IsDuplicates(ref arr, val))

{

arr[i] = val;

flag = false;

}

} while (flag);

if (!flag)

flag = true;

}

return arr;

}

// 查检当前生成的随机数是否重复

public bool IsDuplicates(ref int[] arr, int currRandNum)

{

bool flag = false;

for (int i = 0; i < arr.Length; i++)

{

if (arr[i] == currRandNum)

{

flag = true;

break;

}

}

return flag;

}

调用方法:

int[] arr = GenerateUniqueRandom(1, 10, 10);// 生成 10 个 1 到 10 的随机数

for (int i = 0; i < arr.Length; i++)

Response.Write(arr[i] + ", ");// 结果 10, 7, 9, 4, 3, 5, 1, 2, 6, 8

GenerateUniqueRandom(1, 10, 5);// 生成 5 个 1 到 10 的随机数,结果 9, 1, 7, 2, 10

3、方法三:用 do...while 循环来检查产生的随机数是否重复,只有不重复的随机数才保存到哈希表。

生成随机数:

using System.Collections;

// n 为生成随机数个数

public Hashtable GenerateUniqueRandom(int minValue, int maxValue, int n)

{

// Random.Next(1, 10) 只能产生到 9 的随机数,若要产生到 10 的随机数,maxValue 要加 1

maxValue++;

// Random.Next(1, 10) 只能产生 9 个随机数,因此 n 不能大于 10 - 1

if (n > maxValue - minValue)

n = maxValue - minValue;

Hashtable ht = new Hashtable();

Random ran = new Random((int)DateTime.Now.Ticks);

bool flag = true;

for (int i = 0; i < n; i++)

{

do

{

int val = ran.Next(minValue, maxValue);

if (!ht.ContainsValue(val))

{

ht.Add(i, val);

flag = false;

}

} while (flag);

if (!flag)

flag = true;

}

return ht;

}

调用方法:

Hashtable ht = GenerateUniqueRandom(1, 10, 10);// 生成 10 个 1 到 10 的随机数

foreach (DictionaryEntry de in ht)

Response.Write(de.Value.ToString() + ", ");// 结果 10, 7, 9, 4, 3, 5, 1, 2, 6, 8

GenerateUniqueRandom(1, 10, 5);// 生成 5 个 1 到 10 的随机数,结果 4, 10, 9, 7, 6

4、方法四:用 Linq 生成不重复的随机数

生成随机数:

using System.Linq;

public IEnumerable

GenerateNoDuplicateRandom(int minValue, int maxValue)

{

return Enumerable.Range(minValue, maxValue).OrderBy(g => Guid.NewGuid());

}

调用方法:

IEnumerable list = GenerateNoDuplicateRandom(1, 10);

string str = string.Empty;

foreach (int item in list)

{

str += item.ToString() + ", ";

}

Response.Write(str);// 结果 5, 2, 10, 1, 7, 6, 8, 3, 9, 4

以上几种产生指定随机数的方法,都通过测试,可根据实际开发需要灵活选择,一般情况都是直接用 Random 就可以了。

c# 从一组数中随机抽取一定个数_C#产生指定范围随机数的几种方法-亮术网相关推荐

  1. c# 从一组数中随机抽取一定个数_C#随机一组不重复的数字

    c#编写,随机一组数字,不重复,以1到18为例 首先,先建立 两个数组或者list,存放 randomArray() 产生随机数,并加入到list中, getRandom() 判断产生的随机数是否已经 ...

  2. c# 从一组数中随机抽取一定个数_Python随机模块22个函数详解

    随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性.平时数据分析各种分布的数据构造也会用到. random模块,用于生成伪随机数,之所以称之为伪随机数, ...

  3. 5.4 一家人才测评机构低随机抽取的10名小企业的经理人用两种方法进行自信心测试,得到的自信心测试分数如下

    2022-11-29 5.4 一家人才测评机构低随机抽取的10名小企业的经理人用两种方法进行自信心测试,得到的自信心测试分数如下 人员编号 方法1 方法2 1 78 71 2 63 44 3 72 6 ...

  4. matlab中随机抽取函数,matlab 哪个函数可以从一组数据中随机抽取一部分出来

    假设你原来的数据存在变量a中 如果,你想从a中随机抽取固定N个数 c=randperm(numel(a)); b=a(c(1:N)); b就是从a中随机抽取的N个数(N应该小于a中元素的总个数) nu ...

  5. matlab产生一组均为一的矩阵,在matlab中如何从一组数中得到随机数组成一个n*n的矩阵...

    导航:网站首页 > 在matlab中如何从一组数中得到随机数组成一个n*n的矩阵 时间:2019-3-15 在matlab中如何从一组数中得到随机数组成一个n*n的矩阵 从1,2,3,4,5,6 ...

  6. TODO:从数据库中随机抽取一条记录

    TODO:从数据库中随机抽取一条记录 1.最直接,最粗暴的方法先计算记录的总数,然后选择一个从0到记录总数之间的随机数n,利用skip跳过n条记录,这是效率低下的的方法,首先的记录总数,在用skip会 ...

  7. php 判断5张牌是不是顺子,从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续(面试题)...

    从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的2-10位数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字 统计数组中出现的次数,判断等于0,大于1大于2大 ...

  8. matlab随机抽取数字,Matlab 从多维正态分布中随机抽取样本:mvnrnd

    R = mvnrnd(MU,SIGMA)--从均值为MU,协方差为SIGMA的正态分布中抽取n*d的矩阵R(n代表抽取的个数,d代表分布的维数). MU为n*d的矩阵,R中的每一行为以MU中对应的行为 ...

  9. 在一组数中寻找加和最接近某个值的数组合

    在一组数中寻找加和最接近某个值的数组合 今天碰到个小问题,就是需要在一组数中,找到加和数最接近某个值的一系列数. 比如: [8.05, 6.98, 6.19, 5, 22.96,4.71,4.74,4 ...

最新文章

  1. Dreamer 3.0 支持json、xml、文件上传
  2. qt qtableview 刷新列表_qt qtablewidget 刷新
  3. FindBugs工具常见问题
  4. java long.max_value,Long + Long不大于Long.MAX_VALUE
  5. pushViewController自定义动画http://blog.csdn.net/ralbatr/article/details/22039233
  6. python中不被定义_一日一技:在Python中双下划线私有方法不能被调用的原理
  7. netcore之托管程序
  8. 还在纠结是否入手M1 macbook?看完这篇文章再做决定也不迟!
  9. 忘记root密码,怎么办
  10. 电源管理总线 (PMBus)
  11. pdf.js预览pdf文件流(base64)
  12. 读《因果的真相》第五章摘抄笔记
  13. Apache网站根目录
  14. matlab结构力学仿真,MATLAB在结构力学分析中应用.doc
  15. 监督学习三要素——模型、参数、目标函数
  16. 奥林巴斯新微单E-M5II曝光:合金机身可防水
  17. YB时代,数据保护的“难”与“易”
  18. 系统加速软件 AVG PC Tuneup 2011
  19. 你给我的感悟,我读懂了文字
  20. matlab怎么求两个数的和,matlab怎么求出两个函数的交点

热门文章

  1. springboot细节挖掘(集成ElasticSearch)
  2. 原版win7集成usb3.0驱动_windows7的不老传说,十代U安装win7教程
  3. arm poky linux,Solved: Re: arm-poky-linux - NXP Community
  4. 四脚轻触开关pcb封装_轻触开关的规格尺寸与型号选择
  5. OpenShift 4 - DevSecOps Workshop (13) - 将镜像推送到Quay,并进行漏洞扫描
  6. Cinchoo ETL-对大型CSV文件进行排序
  7. 使用Firebase、Angular 8和ASP.NET Core 3.1保护网站安全
  8. .net core精彩实例分享 -- 网络编程
  9. oracle 11g job创建,Oracle 11g 手动创建库完整实施过程
  10. java中sql语句怎么把开始和结束时间作为参数写sql查询_java程序员跳槽的一道坎,大公司面试官都会问的Mybatis...