为什么0到4的随机数大多数时间是1?

san*_*one 5 java

我正在使用一个简单的随机计算,用于4个元素的小范围.

indexOfNext = new Random().nextInt(4); //randomize 0 to 3
Run Code Online (Sandbox Code Playgroud)

当我连接调试器时,每次结果为1 ,我会看到前2-3次.

对于小范围这是错误的方法还是我应该实现另一个逻辑(检测先前的随机结果)?

注意:如果这只是巧合,那么使用这种方法是错误的方法,对吧?如果是的话,你能建议替代方法吗?可能会洗牌?理想情况下,替代方法可以检查下一个结果是否与前一个结果不同.

pet*_*rov 11

不要new Random()每次创建,创建一个对象并多次调用它.

这是因为您需要一个随机生成器和来自其
随机序列的许多数字,而不是拥有许多随机生成器并且
只获得它们生成的随机序列的第一个数字.


Bat*_*eba 9

您通过重复创建新实例来滥用随机数生成器.(这是由于实现设置了一个起始随机数值,它是系统时钟时间的一个非常确定的函数).这破坏了发电机的统计特性.

您应该创建一个实例,然后nextInt在需要数字时调用.

  • 实际上(讽刺性地迂腐),创建新实例不会以任何方式破坏生成器的统计属性._Each_ generator仍然具有这些美丽的属性,虽然它们被忽略;-) (4认同)

chu*_*ubs 5

你可以做的一件事就是抓住Random实例.它必须在每次实例化时自行播种,如果该种子相同,则每次都会生成相同的随机序列.

其他选项是转换为SecureRandom,但您肯定希望保留该随机实例以获得最佳随机数性能.你真的只需要SecureRandom是你随机生成具有安全隐患的东西.就像实现加密算法或解决这些问题一样.

  • 每次都必须播种,但是API说"这个构造函数将随机数生成器的种子设置为一个非常可能与此构造函数的任何其他调用不同的值." (2认同)