可能重复:
Java:生成范围内的随机数
如何生成随机整数i,i属于(0,10]?
我试着用这个:
Random generator = new Random();
int i = generator.nextInt(10);
Run Code Online (Sandbox Code Playgroud)
但它给了我两者之间的价值[0,10).
但就我而言,我需要它们(0,10].
我需要在Java中使用正好6位的随机数进行生成.我知道我可以在一个随机数上循环6次但是在标准Java SE中有没有其他方法可以做到这一点?
编辑 - 跟进问题:
现在,我可以生成我的6位数,我遇到了一个新问题,我正在尝试创建的整个ID是语法123456-A1B45.那么我如何随机化最后5个可以是AZ或0-9的字符?我正在考虑使用char值和randomice一个介于48 - 90之间的数字,并简单地删除任何获得代表58-64的数字的值.这是要走的路还是有更好的解决方案?
编辑2:
这是我的最终解决方案.谢谢你所有的帮助!
protected String createRandomRegistryId(String handleId)
{
// syntax we would like to generate is DIA123456-A1B34
String val = "DI";
// char (1), random A-Z
int ranChar = 65 + (new Random()).nextInt(90-65);
char ch = (char)ranChar;
val += ch;
// numbers (6), random 0-9
Random r = new Random();
int numbers = 100000 + (int)(r.nextFloat() * 899900);
val += String.valueOf(numbers);
val += "-";
// char or numbers (5), random 0-9 A-Z
for(int …Run Code Online (Sandbox Code Playgroud) 我试图在原始数据类型short的范围(-32768,32767)上生成随机整数.java Random对象仅生成正数.如何在该间隔内随机创建数字?谢谢.
出于某种原因,我常想,java.util.Random是线程安全的,一拉HashMap或BitSet,并且Math.random()被实现为包装访问Random与synchronized块,或ThreadLocalRandom.current().nextDouble().
实际上事实证明它java.util.Random是线程安全的(通过原子).因此需要注意的是:即使我需要在单个线程中使用一些随机输入,使用ThreadLocalRandom也是有意义的,因为内部没有原子读写,编译为锁定指令并发出内存屏障.
而且,由于Java 8 ThreadLocalRandom本质上是一个单例,它的状态保存在某些java.lang.Thread类的字段中.因此,方法ThreadLocalRandom.current()不是访问ThreadLocalMap,而只是静态字段读取,即非常便宜.
我有两个问题:
从计算机科学的角度来看,几个线性同余随机生成器(以ThreadLocalRandoms 的方式初始化)的输出是否与单个线性同余随机生成器(java.util.Random实例)的输出相同"随机" ?
如果回答的第一个问题是肯定的,是否有任何理由写的建设new Random()(不含种子)来代替ThreadLocalRandom.current(),永远不会消失?
更新.我应该调用像ThreadLocalRandom.current().ints().parallel().collect(...)可能是不正确的,因为线程的随机数生成器的状态可能中未初始化ForkJoinPool的工作线程,但看起来,ThreadLocalRandom覆盖方法ints(),longs()以及doubles(),使得上述结构正确.
我们可以很容易地得到所需范围内的随机浮点数[X,Y)(注意X是包含的,Y是独占的),下面列出了函数,因为Math.random()(大多数伪随机数生成器,AFAIK)产生的数字在[0,1):
function randomInRange(min, max) {
return Math.random() * (max-min) + min;
}
// Notice that we can get "min" exactly but never "max".
Run Code Online (Sandbox Code Playgroud)
我们怎样才能得到一个包含两个边界的期望范围内的随机数,即[X,Y]?
我想我们可以Math.random()通过"滚动" IEE-754浮点双精度的位来"增加"我们的值(或等效),将最大可能值精确地设置为1.0,但这似乎很难实现,特别是语言不适合比特操纵.有没有更简单的方法?
(顺便说一句,为什么随机数生成器会产生数字[0,1)而不是[0,1]?)
[编辑]请注意,我没有必要这样做,我完全清楚这种区别是迂腐的.只是好奇并希望得到一些有趣的答案.如果这个问题不合适,请随意投票结束.
可能重复:
Java:生成范围内的随机数
我想在逻辑范围内生成一个随机int.所以,比如说,我正在编写一个程序来"滚动"具有指定数量边的骰子.
public int rollDice() {
Random generator = new Random();
return generator.nextInt(sides);
}
现在的问题变成,这将返回值两侧和零之间的包容性,这是没有意义的,因为大多数的骰子从1到6,9,等等.所以,我怎么可以指定nextInt应该在1和侧面的数量之间的合作?
可能重复:
Java:生成范围内的随机数
我想使用生成随机数
java.util.Random(arg);
Run Code Online (Sandbox Code Playgroud)
唯一的问题是,该方法只能接受一个参数,因此该数字始终在0和我的参数之间.有没有办法在(比方说)200和500之间生成随机数?
我今天遇到了这个问题,我确信有一个我没想到的优雅解决方案.
假设我想在Java中生成一个具有指定位数的随机整数(或长整数),其中这个位数可以改变.
即将多个数字传递给方法,并返回具有指定位数的随机数
例)N = 3,产生100-999之间的随机数; N = 4,生成1000-9999之间的随机数
private long generateRandomNumber(int n){
/*Generate a random number with n number of digits*/
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我的尝试(这有效,但看起来很乱)
private long generateRandomNumber(int n){
String randomNumString = "";
Random r = new Random();
//Generate the first digit from 1-9
randomNumString += (r.nextInt(9) + 1);
//Generate the remaining digits between 0-9
for(int x = 1; x < n; x++){
randomNumString += r.nextInt(9);
}
//Parse and return
return Long.parseLong(randomNumString);
}
Run Code Online (Sandbox Code Playgroud)
有没有比这更好/更有效的解决方案?
*有很多解决方案可以在指定的范围内生成随机数,我对给定一定数量的数字生成随机数的最佳方法更加好奇,并且使解决方案足够强大以处理任意数量的数字.
我不想传递最小值和最大值,而只需要传递所需的位数