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

2013-03-19 22:33:17 +08:00
 Linxing
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);
}
}
3578 次点击
所在节点    Java
13 条回复
nkliwenjian
2013-03-19 22:55:19 +08:00
一眼看上去没有错。先问一下你把这个程序跑了多少次吧。按照概率论,出0的概率为1/10,但是这是在大范围的平均值,小范围的话100个里面出一个0也是有可能的。
Linxing
2013-03-19 23:50:23 +08:00
@nkliwenjian 肯定有错..同样的代码在同学电脑上跑了两三次就会看到一个0...我至少运行了不下50次..一个0都没有看到。。
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
2013-03-20 00:14:37 +08:00
@keakon 学习了,小弟新手,只是课堂的一个小作业.....从0到10当中随意生成是个不同的数...为什么不会生成0呢?
nkliwenjian
2013-03-20 00:46:51 +08:00
你都会说同样的代码别人机器没问题了。我没写java代码很久了,只能提点疑问,你自己去解决了。
1. 你跟你同学的java版本一样不?
2. java的随机数是不是要撒种子的?

代码看不出问题,理论上就是这两个区别。实在不行你就别乘10强转了呗,换个算法不结了,例如乘100取整在除10取余数。
teloon
2013-03-20 00:50:30 +08:00
问题出在Check函数,因为number在初始化时会自动用0填充,所以你把0都过滤了。把number中的元素初始化为-1就行了。
nkliwenjian
2013-03-20 00:58:42 +08:00
@teloon 受教了,好眼力啊。
AnyOfYou
2013-03-20 01:03:01 +08:00
你建立数组的时候,里面的元素都初始化为0了.所以当随机生成0的时候,一判断就认为数组中已经有了而返回.
Linxing
2013-03-20 01:05:50 +08:00
@nkliwenjian 谢谢~
Linxing
2013-03-20 01:06:09 +08:00
@teloon 厉害啊!!解决了.
Linxing
2013-03-20 01:09:16 +08:00
@AnyOfYou 其实这样代码一看就觉得好差劲,看来要换一种算法了.用抽签做吧
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
2013-03-20 18:54:05 +08:00
@meteor 嗯,谢谢提醒,下次会注意的,换了一种思路重写了一遍

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/63461

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX