如何让Math.random()生成的随机数包括1?使用Random()也行
注意:不是生成的数字包含1,就是产生1这个数
比如你要弄个5位数。
1、将1-9,a-z,A-Z.所有字符建成一个数组,数组大小为n
2、然后math.random随机一个5-1的数字,然后到数组中取对应的字。比如你
3、再math.random随机一个5-1的值作为下标,将1放到这个下标上
没怎么明白你意思,关键是[0,1]的double啊
@DM张朋飞: string s=new string{"1","2","3"……},现在要随机3位数,那么先随机一个2位数,这个两位数小于等于s的Length。。。比如是2,3.那么就获取s[2],s[3].现在再随机一个数,作为下标,比如是1,那么就在s[2]和s[3]之间,插入1
@滴答的雨: 不过我感觉还是没有解决我的问题啊,你是在教我如何产生三位小数么
@DM张朋飞: 我是想告诉你这样可以产生3位数,并且一定包含1,至于你的s数组你想怎么定义(多大,包含哪些字符)是你的事
@滴答的雨:
好吧,我没说清楚题意,我是说Math.random产生的是0到1的小数,不过不包括1,如何才能让他产生1,不是产生的数字包含1
Random.Next(1,2)
生成大于等于1小于2的随机整数
我能说你答非所问么
况且没有这个重载方法,只有一参数
加上1 就行了吧
取大于0的整数可以用你这个加1的办法,单如果取整数只要fomate一下就可以有进位,也不用加1那么复杂了。
public static void main(String[] args) {
DecimalFormat df = new DecimalFormat("#");
System.out.println("--------- start ----------");
for(;;){
double d = Math.random() * 10;
String dStr = df.format(d);
//
System.out.println("-------------------");
System.out.println(d);
System.out.println(dStr);
if(dStr.equals("10")){
break;
}
}
}
public static void main(String[] args) {
double d = 0;
Random r = new Random();
for(long i=0;;i++){
d = r.nextDouble();
if(d >= 1.0){
System.out.println("times = "+i);
break;
}
// if(d <= 0.0){
// System.out.println("times = "+i);
// break;
// }
System.out.println(d);
}
}
API文档上是说返回一个从 0.0d(包括)到 1.0d(包括)的double,不过我测了下,一直都没跑出来 0 和 1,估计我用的时间还不够吧!
--------------- API --------------------
nextDouble
public double nextDouble()
0.0
和 1.0
之间均匀分布的 double
值。
nextDouble 的常规协定是伪随机地生成并返回一个从 0.0d(包括)到 1.0d(包括)范围内均匀选择(大致)的 double 值。所有 253 个可能 float 值(其形式为 m x 2-53,其中 m 是一个小于 253 的正整数)的生成概率(大致)相同。Random 类按如下方式实现 nextDouble 方法:
public double nextDouble() { return (((long)next(26) << 27) + next(27)) / (double)(1L << 53); }
前面的描述中使用了不明确的词“大致”,只是因为 next 方法大致为一个单独选择位的公正来源。如果它是一个随机选择位的最佳来源,那么给出的算法应该从起始范围开始完全一致地选择 double 值。
[在 Java 的早期版本中,计算的结果是错误的,因为:
这可能看似等效(如果不是更好的话),但实际上由于浮点数舍入中的偏差,它会引入较大的不均匀性:有效数的低位可能出现的 0 是 1 的三倍!这种不均匀性在实践中可能没什么关系,但是我们应该争取完美。]return (((long)next(27) << 27) + next(27)) / (double)(1L << 54);
0.0
和 1.0
之间均匀分布的 double
值。莫非咱俩API不一样,我的显示不包括
@DM张朋飞:
的确!看来有些中文的API还是不靠谱啊!去官网上看了下是小于1,怎么样问题解决了吗?
The general contract of nextDouble is that one double value, chosen (approximately) uniformly from the range 0.0d (inclusive) to 1.0d (exclusive)
乘以10 然后取整
向下取整没有1,向上没有0
@DM张朋飞:
(int)(Math.random()*10) 我刚刚测试了一下可以输出0~9,完整版
public class Random { public static void main(String[] args){ int i =100; while(i!=0){ System.out.println((int)(Math.random()*10)); i--; } } }
@李子衿: 那不是没有10么
@DM张朋飞: 那你再+1就有10了
@DM张朋飞: 将乘以10改成乘以11,这样输出的随机数在0~10之间
@李子衿: 不过是整数,除以10也得不到double[0,1]
@DM张朋飞: 次奥,你早说啊,你只说要求生成1
@DM张朋飞:
public static void main(String[] args){ int i =100; while(i!=1){ double d =(Math.random()*11)/10; d = ((int)(d*100))/100; //取小数点后两位 if (d>1) continue; System.out.println(d); if (d ==1) break; } }
这次输出的结果在[0,1]之间。Random()和 next()得到的序列都不包含(1.0)。只需要把大于1的不输出就可以了
@DM张朋飞: 麻烦下次问问题的时候 准确点好不好!!
@李子衿: 对不起
路过学习
在数学计算中,我们经常需要进行一些较复杂的运算,为此,Java 语言提供了Math类。Math
类中的许多静态方法与C 语言中的函数类似,可以进行求平方根、求幂等复杂数学计算。
(1)random()方法:随机产生一个大于等于0.0 而小于1.0 的double型数值,也就是说随机产生包
括0.0 而不包括1.0 的数值。
例如,随机产生一个0.0~10.0(包括0.0,不包括10.0)的double型数值的表达式为:
Math.random() * 10
随机产生一个10.0~100.0(包括10.0,不包括100.0)的double型数值的表达式为:
( Math.random() * 90 ) + 10
如果要随机产生一个a~b(包括a 和b)的整数,可以使用下面的公式:
int 变量名 = (int)( Math.random() * ( b – a + 1 )) + a;
例如,要随机产生一个10~50之间的整数,套用公式
int i = (int)( Math.random() * (50 – 10 + 1 )) + 10;