首页 新闻 搜索 专区 学院

如何让Math.random()生成的随机数包括1?

0
[已解决问题] 解决于 2013-08-01 22:24

如何让Math.random()生成的随机数包括1?使用Random()也行

注意:不是生成的数字包含1,就是产生1这个数

加拿大小哥哥的主页 加拿大小哥哥 | 初学一级 | 园豆:183
提问于:2013-07-26 12:50
< >
分享
最佳答案
0

比如你要弄个5位数。

1、将1-9,a-z,A-Z.所有字符建成一个数组,数组大小为n

2、然后math.random随机一个5-1的数字,然后到数组中取对应的字。比如你

3、再math.random随机一个5-1的值作为下标,将1放到这个下标上

奖励园豆:5
滴答的雨 | 老鸟四级 |园豆:3690 | 2013-07-26 12:55

没怎么明白你意思,关键是[0,1]的double啊

加拿大小哥哥 | 园豆:183 (初学一级) | 2013-07-26 13:48

@DM张朋飞: string s=new string{"1","2","3"……},现在要随机3位数,那么先随机一个2位数,这个两位数小于等于s的Length。。。比如是2,3.那么就获取s[2],s[3].现在再随机一个数,作为下标,比如是1,那么就在s[2]和s[3]之间,插入1

滴答的雨 | 园豆:3690 (老鸟四级) | 2013-07-26 13:51

@滴答的雨: 不过我感觉还是没有解决我的问题啊,你是在教我如何产生三位小数么

加拿大小哥哥 | 园豆:183 (初学一级) | 2013-07-26 14:21

@DM张朋飞: 我是想告诉你这样可以产生3位数,并且一定包含1,至于你的s数组你想怎么定义(多大,包含哪些字符)是你的事

滴答的雨 | 园豆:3690 (老鸟四级) | 2013-07-26 14:31

@滴答的雨:

好吧,我没说清楚题意,我是说Math.random产生的是0到1的小数,不过不包括1,如何才能让他产生1,不是产生的数字包含1

加拿大小哥哥 | 园豆:183 (初学一级) | 2013-07-26 15:48
其他回答(6)
0

Random.Next(1,2)

生成大于等于1小于2的随机整数

只会造轮子 | 园豆:2274 (老鸟四级) | 2013-07-26 13:52

我能说你答非所问么

支持(0) 反对(0) 加拿大小哥哥 | 园豆:183 (初学一级) | 2013-07-26 14:12

况且没有这个重载方法,只有一参数

支持(0) 反对(0) 加拿大小哥哥 | 园豆:183 (初学一级) | 2013-07-26 14:15
0

加上1 就行了吧

clarlespeng | 园豆:469 (菜鸟二级) | 2013-07-26 14:29

取大于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;
            }
        }
    }

支持(0) 反对(0) project | 园豆:154 (初学一级) | 2013-07-26 14:56
0

    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.01.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 的早期版本中,计算的结果是错误的,因为:

  return (((long)next(27) << 27) + next(27))
      / (double)(1L << 54);
这可能看似等效(如果不是更好的话),但实际上由于浮点数舍入中的偏差,它会引入较大的不均匀性:有效数的低位可能出现的 0 是 1 的三倍!这种不均匀性在实践中可能没什么关系,但是我们应该争取完美。]
返回:
下一个伪随机数,它是从此随机数生成器的序列中取出的、在 0.01.0 之间均匀分布的 double 值。
project | 园豆:154 (初学一级) | 2013-07-26 14:41

莫非咱俩API不一样,我的显示不包括

支持(0) 反对(0) 加拿大小哥哥 | 园豆:183 (初学一级) | 2013-07-26 15:54

@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)

支持(0) 反对(0) project | 园豆:154 (初学一级) | 2013-07-29 11:22
0

乘以10 然后取整

薛遗山 | 园豆:106 (初学一级) | 2013-07-26 15:52

向下取整没有1,向上没有0

支持(0) 反对(0) 加拿大小哥哥 | 园豆:183 (初学一级) | 2013-07-26 15:56

@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--;
        }
    }
}
支持(0) 反对(0) 薛遗山 | 园豆:106 (初学一级) | 2013-07-26 16:08

@李子衿: 那不是没有10么

支持(0) 反对(0) 加拿大小哥哥 | 园豆:183 (初学一级) | 2013-07-26 16:25

@DM张朋飞: 那你再+1就有10了

支持(0) 反对(0) 薛遗山 | 园豆:106 (初学一级) | 2013-07-26 16:30

@DM张朋飞: 将乘以10改成乘以11,这样输出的随机数在0~10之间

支持(0) 反对(0) 薛遗山 | 园豆:106 (初学一级) | 2013-07-26 17:20

@李子衿: 不过是整数,除以10也得不到double[0,1]

支持(0) 反对(0) 加拿大小哥哥 | 园豆:183 (初学一级) | 2013-07-26 21:26

@DM张朋飞: 次奥,你早说啊,你只说要求生成1

支持(0) 反对(0) 薛遗山 | 园豆:106 (初学一级) | 2013-07-29 21:48

@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的不输出就可以了

支持(0) 反对(0) 薛遗山 | 园豆:106 (初学一级) | 2013-07-29 22:17

@DM张朋飞: 麻烦下次问问题的时候 准确点好不好!!

支持(0) 反对(0) 薛遗山 | 园豆:106 (初学一级) | 2013-07-29 22:18

@李子衿: 对不起

支持(0) 反对(0) 加拿大小哥哥 | 园豆:183 (初学一级) | 2013-08-01 22:23
0

路过学习

panjk | 园豆:712 (小虾三级) | 2013-07-27 10:58
0

在数学计算中,我们经常需要进行一些较复杂的运算,为此,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;

wuhu太棒了! | 园豆:202 (菜鸟二级) | 2015-05-17 18:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册