Java 为什么我的随机数不是那么随机?

Java 为什么我的随机数不是那么随机?,java,random,Java,Random,我使用这个随机数逻辑根据记录的表行偏移量(start到start+1)从数据库中检索记录 但出于某种原因,它不断重复相同的数字:start值0和start值3 我尝试为Random对象设定种子,但没有效果: int totalRecs = getTotalRecs(); // returns '13' int MAX_RECS_PER_LOOKUP = 10; Random rand = new Random(); int start = (totalRecs > Utl.MAX_RECS

我使用这个随机数逻辑根据记录的表行偏移量(
start
start+1
)从数据库中检索记录

但出于某种原因,它不断重复相同的数字:
start
值0和
start
值3

我尝试为
Random
对象设定种子,但没有效果:

int totalRecs = getTotalRecs(); // returns '13'
int MAX_RECS_PER_LOOKUP = 10;
Random rand = new Random();
int start = (totalRecs > Utl.MAX_RECS_PER_LOOKUP) ? rand.nextInt(totalRecs-Utl.MAX_RECS_PER_LOOKUP) : 0;
results = this.getNewRecs(filter, start, start+1);
rand.nextInt(n)
方法返回一个介于0(包括)和n(排除)之间的值

在您的代码中,如果
totalRecs
为13,并且
Utl.MAX\u RECS\u PER\u LOOKUP
为10(我根据代码段中的
MAX\u RECS\u PER\u LOOKUP
值假设此值,但我可能是错误的),则此代码:

long seed = System.currentTimeMillis();
rand.setSeed(seed);
应返回一个介于0和2之间的随机数


我不确定这是否是您真正想要的?

您可以尝试java.security.SecureRandom


这似乎是一个很好的选择,它继承了java.util.Random,请确保您的输入是有效的

通过调试比较

totalRecs Utl.MAX_RECS_PER_查找&从同一迭代开始

你在打电话吗

rand.nextInt(totalRecs-Utl.MAX_RECS_PER_LOOKUP);
如果totalRecs=Utl.MAX\u RECS\u PER\u LOOKUP,您应该“始终”获得0的唯一方法是
但是,如果差异仅为1,则您将随机返回0或1。

什么是Utl.MAX\u RECS\u PER\u LOOKUP?问题可能不是rand.nextInt,而是您的输入将其限制在可能整数的一小部分。发生了一些非常奇怪的事情。如果totalRecs真的是13,那么你不应该得到3(因为你将3传递给nextInt,这是唯一的上限)。你能试着打印totalRecs的值并检查它是否符合你的想法吗?为什么要使用Utl.MAX\u RECS\u PER\u查找而不是刚才设置的MAX)RECS\u PER\u查找?
rand.nextInt(totalRecs-Utl.MAX_RECS_PER_LOOKUP)