产生不重复随机数方法

合集下载

如何产生1-100之间的100个不重复的随机数

如何产生1-100之间的100个不重复的随机数

如何产⽣1-100之间的100个不重复的随机数如何产⽣1-100之间的100个不重复的随机数如果这是你是第⼀次看到这个题⽬,也许你的想法有很多。

1:⾸先从原始数组中随机选择⼀个数字,然后将该数字从数组中剔除,再随记选,再剔除,重复99次,就解决了。

我们知道从数组中剔除⼀个元素的复杂度为O(N),那么随机选取n个数字,它的复杂度就是O(N2)了。

2:⽤hash作为中间过滤层,因为在数组中,我们采⽤随机数的话,也许随机数在多次随机中可能会有重复,所以需要⽤hash来判断⼀下,如果在hash中重复,则继续产⽣随机数,直到不重复为⽌,当然这个复杂度就不好说了,得要看随机数随机不随机了,好的话,O(N)搞定,不⾛运的话⽆上限~3:就像标题说的⼀样,很多问题我们都能在现实⽣活中找到写照,毕竟很多东西是来源于现实,⼜抽象于现实,⽐如这个题⽬在现实⽣活中, 可以对应到的就是“洗扑克牌”,在算法中也叫“洗牌原理”,我们知道洗扑克牌的⽅式就是随机的交换扑克牌的位置,⼜叫做"切牌",当你切了很多次后,我们的扑克牌就可以认为是⾜够乱了,复杂度也就变成了O(N),⽤代码实现就是这样的。

<1> 先有序的⽣成52张牌,然后有序的放到数组中。

<2>从1-52中随机的产⽣⼀个数,然后将当前次数的位置跟随机数的位置进⾏交换,重复52次,我们的牌就可以认为⾜够乱了。

4:代码实现<1> ⾸先定义牌的数据结构,定义⼀个“花⾊”和“数字”1 /// <summary>2 ///具体扑克牌3 /// </summary>4 public class Card5 {6 public char suit;78 public string num;9 }<2>有序的⽣成52张牌1 /// <summary>2 ///开牌3 /// </summary>4 public void NewCard()5 {6 for (int i = 1; i <= card.Length; i++)7 {8 var suit = ((i - 1) / 13) + 3;9 var num = i % 13;1011 string temp;1213 switch (num)14 {15 case 1: temp = "A"; break;16 case 11: temp = "J"; break;17 case 12: temp = "Q"; break;18 case 0: temp = "K"; break;19 default: temp = num.ToString(); break;20 }2122 card[i - 1] = new Card()23 {24 suit = (char)suit,25 num = temp26 };27 }28 }<3> 然后就是切牌了,刚才也说了思路,就是拿随机数的位置与当前i的位置进⾏交换,不过⼀说到交换就想起了“冒泡排序”,可能被毒害太 深了(┬_┬),不知道你感觉到了没。

在指定的范围内,生成不重复的随机数序列(排除法,筛选法)

在指定的范围内,生成不重复的随机数序列(排除法,筛选法)

在指定的范围内,生成不重复的随机数序列(排除法,筛选法)import java.util.ArrayList;import java.util.List;import java.util.Random;/**•在指定的范围内,生成不重复的随机数序列•*/•public class UnrepeatRandomNumber {• private int min;• private int max;•public UnrepeatRandomNumber() {this.min = 0;this.max = 10;}public UnrepeatRandomNumber(int min, int max) {this();if (max >= min) {this.min = min;this.max = max;} else {System.out.println("max比min小,按缺省值生成UnrepeatRandomNumber对象!");}}/**o第一种方法:排除法。

随机生成数字,如果是新生成的数字,则放到结果列表种否则是已经生成过的,则不加入结果列表,继续随机生成。

oo@param lengtho结果列表的长度o@returno*/o public Integer[] getRandomMethodA(int length) {o if (length <= 0) {ooo return new Integer[0];} else if (length > (this.max - this.min)) {System.out.println("结果列表长度不能达到:" + length + ", 结果长度只能是:"+ (this.max - this.min));length = this.max - this.min;}Random rd = new Random();// 用于生成随机结果List resultList = new ArrayList();while (resultList.size() < length) {// 将[min, max]区间等价于min + [0, max - min + 1)Integer randnum = new Integer(this.min+ rd.nextInt(this.max - this.min + 1));if (!resultList.contains(randnum)) {resultList.add(randnum);}}// 使用toArray方法将List转换成对象数组返回return (Integer[]) resultList.toArray(new Integer[0]);/**o第二种方法:筛选法。

php 生成10位不重复的随机数的方法

php 生成10位不重复的随机数的方法

php 生成10位不重复的随机数的方法PHP生成10位不重复的随机数的方法方法一:使用rand函数和数组判断重复1.使用一个空数组存储随机数2.使用while循环,当数组长度小于10时,执行以下步骤3.生成一个随机数,使用rand函数4.使用in_array函数判断随机数是否存在于数组中,如果不存在则将其添加到数组中5.重复步骤3和4,直至数组长度达到10即可方法二:使用mt_rand函数和数组判断重复1.使用一个空数组存储随机数2.使用while循环,当数组长度小于10时,执行以下步骤3.生成一个随机数,使用mt_rand函数4.使用in_array函数判断随机数是否存在于数组中,如果不存在则将其添加到数组中5.重复步骤3和4,直至数组长度达到10即可方法三:使用range函数和shuffle函数1.使用range函数生成一个包含1到10的数组2.使用shuffle函数将数组中的元素随机打乱3.使用array_slice函数截取数组的前10个元素即可方法四:使用UUID1.使用uniqid函数生成一个唯一的标识符2.使用substr函数截取标识符的前10位即可方法五:使用md5哈希值1.使用md5函数对当前的时间戳进行哈希2.使用substr函数截取哈希值的前10位即可方法六:使用str_shuffle函数和substr函数1.生成一个包含0到9的字符串,例如$str = ““;2.使用str_shuffle函数将字符串中的字符随机打乱3.使用substr函数截取打乱后的字符串的前10个字符即可注意:以上方法生成的随机数并不是完全随机的,如果需要更高强度的随机数,可以使用更复杂的算法或者调用外部的随机数生成器。

以上是PHP生成10位不重复的随机数的几种常见方法,根据实际需求选择合适的方法即可。

当我们在开发中需要生成10位不重复的随机数时,可以使用PHP 中的各种方法来实现。

接下来,我将继续介绍几种方法。

JAVA随机数之多种方法从给定范围内随机N个不重复数

JAVA随机数之多种方法从给定范围内随机N个不重复数

JAVA随机数之多种方法从给定范围内随机N个不重复数在Java中生成随机数有多种方法,例如使用Math类的random(方法,使用Random类,以及使用ThreadLocalRandom类。

下面将介绍不同方法从给定范围内随机生成N个不重复数的实现。

方法一:使用Math类的random(方法Math类的random(方法返回一个浮点数,在范围[0.0, 1.0)之间。

我们可以通过将其乘以范围的长度,并强制转换为整数来获得在给定范围内的随机整数。

```javaint min = 1; // 最小值int max = 100; // 最大值int N = 10; // 需要生成的随机数个数Set<Integer> set = new HashSet<>(;while(set.size( < N)int randomNum = min + (int)(Math.random( * (max - min));set.add(randomNum);for (int num : set)System.out.println(num);```方法二:使用Random类Random类是Java提供的一个伪随机数生成器。

我们可以使用nextInt(方法从给定范围内生成一个随机整数。

```javaint min = 1;int max = 100;int N = 10;Random rand = new Random(;Set<Integer> set = new HashSet<>(;while(set.size( < N)int randomNum = rand.nextInt(max - min + 1) + min;set.add(randomNum);for (int num : set)System.out.println(num);```方法三:使用ThreadLocalRandom类ThreadLocalRandom类是Java 7中引入的一个新类,它提供了线程本地的随机数生成器。

指定区间生成不重复随机数字公式

指定区间生成不重复随机数字公式

指定区间生成不重复随机数字公式
【最新版】
目录
1.引言
2.随机数字生成算法的原理
3.指定区间生成不重复随机数字的公式
4.公式的实现
5.结论
正文
1.引言
在许多编程和数据分析任务中,我们需要生成一定数量的不重复随机数字。

为了满足这个需求,我们可以使用随机数字生成算法。

本文将介绍一种指定区间生成不重复随机数字的公式。

2.随机数字生成算法的原理
随机数字生成算法主要基于伪随机数生成器。

伪随机数生成器可以根据一个种子值生成一串看似随机的数字序列。

在计算机中,我们通常使用线性同余生成器、梅森旋转算法等方法来实现伪随机数生成器。

3.指定区间生成不重复随机数字的公式
假设我们希望在一个指定的区间(如 [a, b])内生成不重复的随机数字,我们可以使用以下公式:
```
r = a + (b - a) * rand()
```
其中,`rand()`表示伪随机数生成器生成的 0 到 1 之间的随机数,`a`和`b`分别表示区间的左端点和右端点。

通过这个公式,我们可以在指定的区间内生成一个不重复的随机数字。

4.公式的实现
为了实现这个公式,我们可以按照以下步骤操作:
1) 首先,确定指定区间的左端点和右端点,即`a`和`b`。

2) 然后,生成一个 0 到 1 之间的随机数,记为`rand_num`。

3) 最后,将`rand_num`乘以(`b` - `a`),并加上`a`,得到生成的随机数字`r`。

5.结论
通过上述公式,我们可以在指定的区间内生成不重复的随机数字。

生成一定范围内的不重复随机数

生成一定范围内的不重复随机数

⽣成⼀定范围内的不重复随机数最容易想到的⽅法,是逐个产⽣这些随机数,每产⽣⼀个,都跟前⾯的随机
数⽐较,如果重复,就重新产⽣。

这是个很笨的⽅法,且⽐较次数呈线性增长,越往后次数越多。

例如下⾯产⽣100个100以内不重复随机数的代码:
int a[100];
for(i=0; i<=99; ++i) a[i]=i; //⾸先⽣成这个范围内的所有随机数
for(i=99; i>=1; --i) swap(a[i], a[rand()%i]);//改范围内的所有随机数,两两交换
再看下⾯的代码,原理跟上⾯例⼦相似,但效率⽐上⾯的差点,但仍不失为⼀个好⽅法:
int a[100]={0};//初始化为0
int i, m;
for(i=1; i<=99; ++i)
{
while(a[m=rand()%100]);//如果不为0,则⽆需赋值,如果为0,则赋值
a[m] = i;//从1~99逐个赋值
}
1.产⽣⼀个随机数(从0到32767)
srand((unsigned) time(NULL)); //为了提⾼不重复的概率
rand(); //产⽣随机数
2.产⽣从m到n的随机数(包括m,不包括n)
srand((unsigned) time(NULL)); //为了提⾼不重复的概率
rand()%(n - m + 1) + m; //使⽤时将m和n换为具体数即可。

JAVA随机数之多种方法从给定范围内随机N个不重复数

JAVA随机数之多种方法从给定范围内随机N个不重复数

JAVA随机数之多种方法从给定范围内随机N个不重复数在Java中,我们可以使用多种方法从给定范围内随机生成N个不重复的数。

下面将详细介绍三种常用的方法:使用集合、Fisher-Yates洗牌算法和递归。

1.使用集合:使用集合可以保证生成的数不重复。

我们可以使用Java中的HashSet类来完成这个任务。

算法如下:(1)创建一个HashSet对象来存储生成的数。

(2)生成一个随机数,并检查是否在HashSet中已经存在。

(3)如果不存在,将随机数添加到HashSet中,并继续生成下一个随机数,直到HashSet中的元素个数达到N。

(4)返回HashSet中的元素作为结果。

代码示例:```javaimport java.util.HashSet;import java.util.Random;public class RandomNumberGeneratorpublic static HashSet<Integer> generateRandomNumbers(int min, int max, int count)HashSet<Integer> numbers = new HashSet<>(;Random random = new Random(;while (numbers.size( < count)int randomNumber = random.nextInt(max - min + 1) + min;numbers.add(randomNumber);}return numbers;}public static void main(String[] args)HashSet<Integer> randomNumbers = generateRandomNumbers(1, 10, 5);System.out.println(randomNumbers);}}```该代码可以生成1到10之间的5个不重复的随机数。

verilog和system verilog产生不重复随机数序列的方法

verilog和system verilog产生不重复随机数序列的方法

相信各位设计/验证工程师在写verilog testbench的时候都会需要产生随机数,如果你直接调用系统自带的$random系统函数的话,你会发现每次仿真产生的随机数序列是一样的,这是因为调用随机数系统函数时没有指定随机数种子,系统会直接调用默认的种子,所以每次产生随机数都用了同样的种子,那么随机数序列也就是一样的。

下面提供两种产生每次都不一样的随机数序列的方法:1.在vcs脚本中产生随机种子在vcs脚本中添加:set seed =''set seed =$$$$+ntb_random_seed=$seed \这种方式只需要在bench中用$urandom就可以每次都产生不一样的随机数,如果要配置种子,则使用命令:run +seed=12342.在bench中产生随机种子testbench中加入以下代码:import "DPI-C" function int c_random();initial begin:random_seed_capif($value$plusargs("SEED=%d",seed))begin$display(“use the outside seed”);endelse beginseed = c_random();$display(“the random seed = %d”,seed);endend在bench中使用random_dat=$random(seed)就能产生不重复的随机数序列。

如果需要指定随机数种子,在run命令中加上:+SEED=1234就能指定这次仿真产生的随机数序列是以1234为种子。

文件:“c_random.c”#include<stdlib.h>#include<time.h>#include<unistd.h>#include"svdpi.h"#include"vpi_user.h"#include"veriuser.h"long int c_random(){long int seed;time(&seed);seed=seed*getpid(); srand(seed);return(rand());}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

生成不重复的随机数的三种方法
下面我以生成1-10之间的10个不重复的随机数为例介绍生成不重复的随机数的三种方法: 1,通过while循环来实现
通过while循环不停的生成随机数,直到生成一个不重复的为止,这种方法比较容易想到,但是效率也比较低下,实例代码如下:
static void Main(string[] args)
{
int[] result = new int[10];
int tmp = -1;
Random random = new Random();
bool repeat = false;
for (int i = 0; i < 10; i++)
{
repeat = true;
while (repeat)
{
repeat = false;
tmp = random.Next(1, 11);
for (int j = 0; j < i; j++)
{
if (tmp == result[j])
{
repeat = true;
break;
}
}
}
result[i] = tmp;
}
for (int i = 0; i < 10; i++)
Console.WriteLine(result[i].ToString());
}
2,通过for循环来实现
方法1使用了多处循环嵌套,效率十分低下,所以我应用一定的技巧来减少循环嵌套,来达到提高程序效率的目的。

主要思路是如果检测到重复,就把循环变量减1,这样来重新进行一次循环,重新生成一个随机数,直到生成一个不重复的随机数为止,实例代码如下:static void Main(string[] args)
{
int[] result = new int[10];
int tmp = -1;
Random random = new Random();
bool repeat = false;
for (int i = 0; i < 10; i++)
{
repeat = false;
tmp = random.Next(1, 11);
for (int j = 0; j < i; j++)
{
if (tmp == result[j])
{
repeat = true;
break;
}
}
if (!repeat)
{
result[i] = tmp;
}
else
{
i = i - 1;//循环变量-1
}
}
for (int i = 0; i < 10; i++)
Console.WriteLine(result[i].ToString());
}
这个方法减少了一层循环嵌套,效率上有一定的改善!
3,通过随机排序来实现
这种方法彻底的颠覆了方法1和2的基本思路,先初始化一个包含数字1-10的数组,然后每次循环取一个随机位置,将这个位置的元素和最后一个位置的元素交换!实例代码如下:static void Main(string[] args)
{
int[] result = new int[10];
for (int i = 0; i < 10; i++)
result[i] = i + 1;
for (int j = 9; j > 0; j--)
{
Random r = new Random();
int index = r.Next(0, j);
int temp = result[index];
result[index] = result[j];
result[j] = temp;
}
for (int i = 0; i < 10; i++)
Console.WriteLine(result[i].ToString());
}
这种方法消除了循环嵌套,效率上获得了进一步的改善,但是也有一定的限制,如果要生成5个1-10之间的随机数,那这种打乱顺序的方法就无法使用了!
总结:方法1效率比较低下,一般不推荐使用!
方法2比较通用,效率高于方法1,但是效率低于方法3
方法3虽然效率比较高,但是只能应用与特定的情况下!。

相关文档
最新文档