V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Linxing
V2EX  ›  Java

Java新手,我实在搞不懂为什么选出来的数没有0...求大神帮帮忙..难道我思路上就错了?

  •  
  •   Linxing ·
    linxing · 2013-03-19 22:33:17 +08:00 · 3722 次点击
    这是一个创建于 4268 天前的主题,其中的信息可能已经有所发展或是发生改变。
    public class RandomNumber
    {
    public static void main(String args[])
    {
    int[] number=new int[4];
    boolean flag=true;

    for(int i=0; i<number.length; i++)
    {
    int temp = RandomNumber.Generator();
    while(flag)
    {
    if(RandomNumber.Check(temp,number))
    flag = false;
    else
    temp = RandomNumber.Generator();
    }
    number[i] = temp;
    flag=true;
    }
    for(int i : number)
    System.out.print(i + " ");
    }

    public static boolean Check(int n, int[] num)
    {
    for(int x : num)
    {
    if(x == n)
    return false;
    }
    return true;
    }

    public static int Generator()
    {
    return (int)(Math.random() * 10);
    }
    }
    13 条回复    1970-01-01 08:00:00 +08:00
    nkliwenjian
        1
    nkliwenjian  
       2013-03-19 22:55:19 +08:00
    一眼看上去没有错。先问一下你把这个程序跑了多少次吧。按照概率论,出0的概率为1/10,但是这是在大范围的平均值,小范围的话100个里面出一个0也是有可能的。
    Linxing
        2
    Linxing  
    OP
       2013-03-19 23:50:23 +08:00
    @nkliwenjian 肯定有错..同样的代码在同学电脑上跑了两三次就会看到一个0...我至少运行了不下50次..一个0都没有看到。。
    keakon
        3
    keakon  
       2013-03-19 23:52:43 +08:00
    逻辑上没看出什么问题,但总觉得好蛋疼。

    Java 的方法命名应用小写字母打头的驼峰式。
    Check() 方法和 RandomNumber 类根本没关系,其实 static 方法都应该审视一下。
    Generator() 方法里有个奇葩的 10,应该作为参数。获取随机整数应用 Random 类的 nextInt() 方法。
    应该提供一个接口,生成一个随机数数组,而不是放在 main() 里来实现。当数组长度过长时,或许得用堆或集合来替代数组。

    当然,最想吐槽的就是用 Python 实现只需一行代码就行了:
    random.sample(xrange(10), 4)
    Linxing
        4
    Linxing  
    OP
       2013-03-20 00:14:37 +08:00
    @keakon 学习了,小弟新手,只是课堂的一个小作业.....从0到10当中随意生成是个不同的数...为什么不会生成0呢?
    nkliwenjian
        5
    nkliwenjian  
       2013-03-20 00:46:51 +08:00
    你都会说同样的代码别人机器没问题了。我没写java代码很久了,只能提点疑问,你自己去解决了。
    1. 你跟你同学的java版本一样不?
    2. java的随机数是不是要撒种子的?

    代码看不出问题,理论上就是这两个区别。实在不行你就别乘10强转了呗,换个算法不结了,例如乘100取整在除10取余数。
    teloon
        6
    teloon  
       2013-03-20 00:50:30 +08:00   ❤️ 1
    问题出在Check函数,因为number在初始化时会自动用0填充,所以你把0都过滤了。把number中的元素初始化为-1就行了。
    nkliwenjian
        7
    nkliwenjian  
       2013-03-20 00:58:42 +08:00
    @teloon 受教了,好眼力啊。
    AnyOfYou
        8
    AnyOfYou  
       2013-03-20 01:03:01 +08:00   ❤️ 1
    你建立数组的时候,里面的元素都初始化为0了.所以当随机生成0的时候,一判断就认为数组中已经有了而返回.
    Linxing
        9
    Linxing  
    OP
       2013-03-20 01:05:50 +08:00
    @nkliwenjian 谢谢~
    Linxing
        10
    Linxing  
    OP
       2013-03-20 01:06:09 +08:00
    @teloon 厉害啊!!解决了.
    Linxing
        11
    Linxing  
    OP
       2013-03-20 01:09:16 +08:00
    @AnyOfYou 其实这样代码一看就觉得好差劲,看来要换一种算法了.用抽签做吧
    meteor
        12
    meteor  
       2013-03-20 16:46:05 +08:00
    https://gist.github.com/meteormatt/5203118#file-randomnumber-java

    v2ex上没有代码高亮的。建议放到GitHub或是GitCafe上。
    代码本身不难,可能就这个方法带进来的参数有问题。
    public static boolean Check(int n, int[] num)
    Linxing
        13
    Linxing  
    OP
       2013-03-20 18:54:05 +08:00
    @meteor 嗯,谢谢提醒,下次会注意的,换了一种思路重写了一遍
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1246 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:47 · PVG 07:47 · LAX 15:47 · JFK 18:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.