该如何让随机数不重复!!!我想不到了?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了该如何让随机数不重复!!!我想不到了?相关的知识,希望对你有一定的参考价值。

Scanner sc = new Scanner(System.in);
int xx = sc.nextInt();
Random r = new Random();
int[] ar = r.nextInt(12);
//int [] sss = r.nextInt(40);
for(int i = 0 ; i<xx;i++)

for (int j = i+1; j < xx; j++)
if(ar[i] == ar[j])
i--;


System.out.println(ar[i]);


参考技术A Random需要一个种子, 如果没给用预设的, 因为每次都一样, 所以一定会按照相同顺序, 每次开启都一致.
常见做法就是将时间当作种子, 每次运行的时间都不会一样, 自然就不会重复了.
参考技术B =ROUND(1+(50-1)*RAND(),0)
把公式复制粘贴到D17,向右拖动填充柄即可。如果要避免重复,应该只能用vba解决。
参考技术C 方法一:公式法
01
我们以生成1-10范围内的随机数字为例,讲述方法。
首先,在A2单元格中输入公式:=SMALL(IF(COUNTIF($A$1:A1,ROW($1:$11))=0,ROW($1:$11)),INT(RAND()*(11-ROW(A1))+1))
然后按下Ctrl+Shift+Enter三键结束数组公式。
02
然后,下拉填充公式到A12单元格,也就是填充11个单元格,为什么要填充11个呢,我们明明只要10个数字?这是因为,最后一个数字是不会变化的,所以呢,要生成10个随机数,需要填充11个单元格,同样的生成11个随机数的话,要填充12个单元格,除此之外,公式中的11还要改成12。
03
生成随机数后,每按下一次F9(或者其他单元格进行一次计算),随机数就会刷新一次,重新生成一组随机数,要注意喽!
04
好了,一组不重复的随机数字生成了,现在我们回头看看这个公式是怎么实现的吧。首先看Small函数的第一个参数,也就是数字区域,这里是利用if和Countif函数来实现此单元格上面的单元格区域,是否有当前单元格的数字,如果有,就返回False,而如果没有就返回这个数字,从而生成一组由上面单元格没有的数字和Flase组成的序列,下图是按F9得到的结果:
05
Small函数的第二个参数,也就是从这个序列中取第几个最小值,在得到的数字中,利用随机函数rand和row函数,实现在这有个个数中随机抽取一个数字,从而得到排序中这个数字顺序的一个数字。通过这样一个数组公式,就实现了生成一组不重复的随机数字啦。
方法二:VBA法
01
VBA功能强大,可以利用很多算法实现随机数。这里介绍一种简单的办法。首先在Excel中按下Alt+F11,打开VBE界面,双击要生成随机数的工作表,在右侧空白处需要输入代码。
02
输入代码如下:
Sub m()
Range("A:A").ClearContents'这里是A列,根据需要修改
For i = 1 To 10'这里是10个数字,根据需要修改
kkk:
Randomize
x = Int(Rnd * 10) + 1
If Application.CountIf(Range("A:A"), x) = 0 Then
Cells(i, 1) = x
Else
GoTo kkk
End If
Next i
End Sub
代码原理很简单,就是随机生成数字,如果A列中有了这个数字,就返回再次随机生成,一直到没有这个数字为止;利用循环生成制定数量的数字。
03
按下F5执行代码,就看到在对应的Sheet中的对应列,生成了一组随机的不重复的数字。
特别提示
数组公式一定要Ctrl+Shift+Enter三键结束才可以
上述是1-10,10个数字为例说明的,根据需要,修改公式中或代码中的关键字,就可以生成其他的数字序列
参考技术D 我也想不到啊。。。。。。。。

golang连续生成随机数重复

看上图!
这是睡眠时间之后:

其实我猜测是循环已经好几遍了,但是电脑的时间还没有变,导致多次循环的种子纳秒数一致,才生成了相同的数。

package main
import (
"fmt"
"math/rand"
"time"
)
func main() 
for i := 0; i < 20; i++ 
r := rand.New(rand.NewSource(time.Now().UnixNano()))
//rand.Seed(time.Now().UnixNano()) //以当前纳秒数作为随机数种子
n := r.Int63()
fmt.Println(n)

查了下这样可以

不知道他内部怎么实现的   unixnano 

追问

你看下我电脑的执行情况:

追答

删掉 exe
重新编译安装呢

追问

不行!

来自:求助得到的回答
参考技术A package mainimport ("fmt""math/rand""time")func main()
r := rand.New(rand.NewSource(time.Now().UnixNano()))
for i := 0; i < 20; i++ //rand.Seed(time.Now().UnixNano()) //以当前纳秒数作为随机数种子n := r.Int63()fmt.Println(n)
//相同的种子 会输出相同的随机值

以上是关于该如何让随机数不重复!!!我想不到了?的主要内容,如果未能解决你的问题,请参考以下文章

.net 下用C#产生一个永不重复10位随机数

如何在 ListBox 中查找最小重复值的索引?

JS生成不重复的随机数组的简单实例

jquery js 不重复随机数

C# 如何生成不重复的1-100随机数。

怎么用Java产生不重复的邀请码