java重复new_Java:(new Random())。nextInt(5)总是返回相同的数字吗?

有时这段代码总是返回相同的数字(有时效果很好):

(new Random()).nextInt(5)

我怀疑问题出在哪里-它可能总是用相同的种子创建一个新的Random。 那么什么是最好的解决方案:

为Random()创建一个静态变量,并

改用它。

使用Math.random()* 5

(看起来它使用了静态变量

内部)

或者是其他东西? 我不需要花哨的东西,只是看起来很随意的东西。

如果有人可以解释为什么原始代码有时有效而有时无效的话,这也将有所帮助。

谢谢。

我认为这是您的答案stackoverflow.com/questions/767999/

多数民众赞成在C#随机,而不是Java。 表面上相似,但不

我认为这可能会有所帮助,stackoverflow.com/questions/203382/

根据定义,数字的随机序列包括重复项。 从来没有连续两次返回相同数字的随机数生成器不是随机的。 3,3,3,3,3是可能的随机序列。

"有时这段代码总是返回相同的数字"-什么?????????

您可以投掷硬币50次,并且总是会正面;)

解释一下:"我做错了,为什么不起作用?"

java.util.Random的javadoc很清楚:

If two instances of Random are created

with the same seed, and the same

sequence of method calls is made for

each, they will generate and return

identical sequences of numbers.

默认构造函数也很清楚:

Creates a new random number generator.

This constructor sets the seed of the

random number generator to a value

very likely to be distinct from any

other invocation of this constructor.

换句话说,没有保证。

如果需要更随机的算法,请使用java.security.SecureRandom。

只需创建一个(并且只有一个)Random()实例即可解决所有随机性问题。

完全清楚。它没有说明为什么它会在不同时间返回相同的值(我不是并行调用它们),也没有说明默认情况下使用了哪个种子。

确实,这就是为什么如果您需要依赖随机数流,则不应该使用它的原因,这也是为什么Java加密软件包不使用它的原因。

如果创建SecureRandom的多个实例,则将削弱其传递随机数的能力,与Random一样多。

如果要在连续的代码行上调用该代码行,那么可以,您正在创建的两个Random实例可以使用相同的种子时钟来创建(时钟毫秒滴答计数是Random对象的默认种子)。几乎普遍来说,如果应用程序需要多个随机数,则可以创建一个Random实例,然后根据需要重复使用它。

编辑:有趣的是,自1.4.2起,用于Random的javadoc发生了变化,这说明时钟已用作默认种子。显然,这不再是保证。

编辑#2:顺便说一句,即使您重复使用正确播种的Random实例,在调用nextInt(5)的时间的大约1/5时,您仍将获得与上一次调用相同的随机数。

public static void main(String[] args) {

Random rand = new Random();

int count = 0;

int trials = 10000;

int current;

int previous = rand.nextInt(5);

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

{

current = rand.nextInt(5);

if( current == previous )

{

count++;

}

}

System.out.println("Random int was the same as previous" + count +

" times out of" + trials +" tries.");

}

"如果有应用程序需要"还是"除非有应用程序需要"?

@ S.Lott:"如果应用程序需要"。如果我的应用程序仅需要一个随机数,则仅使用他当前的实现(new Random())。nextInt(5)。如果我需要一个以上的对象(正如您所指出的,这几乎是普遍的情况),我会保留那个Random对象。

...Sometimes this piece of code [..] returns the same number (and sometimes it works fine)...

所以它随机工作??? :) :) :)

好吧,好吧,现在就对我投反对票!

我会说这是随机的:)

我很惊讶,在过去的四年中,我显然是第一个真正投票的人。

@SimonAndrForsberg这意味着stackoverflow模型有效!大多数人不明白这一点。

@OscarRyz在认真研究的过程中,我遇到了这个问题。实际上,这让我感到很开心:)不想让自己失望,相反,我努力了...

在Java 1.4中,API文档中将新Random实例的默认种子指定为System.currentTimeMillis()的结果。显然,一个紧密的循环可以在每个刻度上创建许多Random()实例,所有实例都具有相同的种子,并且都产生相同的伪随机序列。这在某些时钟分辨率较差(10毫秒或更高)的平台(例如Windows)上尤其糟糕。

但是,从Java 5开始,每次默认构造函数的调用都将种子设置为"很可能是不同的值"。对于每个Random实例,使用不同的种子,结果应根据需要随机出现。

近似均匀分布的最佳方法是使用静态方法Random.nextInt(n)产生[0,n-1]范围内的整数(是,n被排除)。在您的特定示例中,如果希望整数在0到5之间(包括0和5),则应调用Random.nextInt(6)。

用于Random的Javadoc对此并不明确,但是它使用的种子可能取决于当前系统时间。它确实声明随机数对于相同的种子将是相同的。如果您在同一毫秒内使用该调用,它将使用相同的种子。最好的解决方案可能是使用静态的Random对象,并将其用于随后的方法调用。

自Java 5。

id说他可能在使用Java 1.4或更早版本。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值