为什么我的随机数字不那么随机?
问题描述:
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);
我正在使用此随机数逻辑从数据库中检索记录,基于表格行偏移量(start
高达start+1
)。为什么我的随机数字不那么随机?
但由于某种原因它不断重复相同的数字:start
值0和start
值3。
我试图播种Random
对象,但它并没有区别:
long seed = System.currentTimeMillis();
rand.setSeed(seed);
答
的rand.nextInt(n)
方法返回0之间(含)的值和n(不包括)。
在你的代码,如果totalRecs
是13,而Utl.MAX_RECS_PER_LOOKUP
是10(我假设这一个基于您的代码段的MAX_RECS_PER_LOOKUP
价值,但我可能是错的),那么这段代码:
rand.nextInt(totalRecs-Utl.MAX_RECS_PER_LOOKUP);
应该返回一个介于0和2之间的随机数。
我不确定这是您真正想要的吗?
答
你可以尝试java.security.SecureRandom中
这似乎是一个很好的选择,它从java.util.Random的
答
继承确保你的投入是有效的。
通过调试比较
totalRecs Utl.MAX_RECS_PER_LOOKUP值&开始在同一个迭代。
要调用
rand.nextInt(totalRecs-Utl.MAX_RECS_PER_LOOKUP)
你应该“总是”越来越0的唯一方法是,如果totalRecs = Utl.MAX_RECS_PER_LOOKUP 但是,如果差别仅仅是1,那么你会得到0或1只。
什么是Utl.MAX_RECS_PER_LOOKUP?可能问题不是rand.nextInt,而是您的输入将它限制为可能整数的一小部分。 – 2010-11-11 13:39:35
发生了一些非常奇怪的事情。如果totalRecs真的是13,那么你不应该得到3(因为你传递3 nextInt,这是唯一的上限)。你可以尝试打印totalRecs的值并检查它是你的想法吗?为什么您使用Utl.MAX_RECS_PER_LOOKUP而不是您刚刚设置的MAX)RECS_PER_LOOKUP? – 2010-11-11 13:39:42