作者tkcn (say)
看板java
标题Re: [承上面]67个if的美学果然不适合小弟...
时间Wed Oct 17 01:37:54 2012
※ 引述《JazzChen (PhoenixJazz)》之铭言:
: 小弟在前一篇发表了67个if
: 一时之间成了版标...太令小弟震惊了!
: 不过小弟不是个"勤能补拙"的人,无法好好地写完67个if
: 最後综合了各家说法以及小弟个人(翻书)的见解,
: 在此放上小弟脑力激荡後的写法
: 请各位大大赐教!希望能够再增进JAVA的功力!
: 默默附上:
: //random number
: int[] D = new int[4];
: D[0] = (int) (Math.random()*10);
: do{
: D[1]=(int) (Math.random()*10);
: } while(D[0] == D[1]);
: do{
: D[2]=(int) (Math.random()*10);
: } while(D[0] == D[2] || D[1] == D[2]);
: do{
: D[3]=(int) (Math.random()*10);
: } while(D[0] == D[3] || D[1] == D[3] || D[2] == D[3]);
我来补充个出发点不太一样的作法。
先产生好按照顺序排列的数字,然後对数列作洗牌的动作。
int n = 10;
int[] D = new int[n];
for (int i=0; i<n; i++) D[i] = i;
for (int i=0; i<n; i++) swap(D, i, (int) (Math.random()*n));
猜数字只需要四个数字,所以就取前四个数字出来用即可。
swap 顾名思义就是交换阵列中两个元素的位置,实作就不贴上来了 :p
洗牌所用的演算法叫做 Fisher-Yates shuffle,
Wikipedia 上有非常详尽的说明:
http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
不过别被它吓到了,
实际上就只是依序将第 i 个元素与 random 位置的元素作交换。
(至於这样洗牌洗得乾净吗?请参阅 Wikipedia)
相同的想法,如果能善用 Java 内建的 API,就可以写成这样。
int n = 10;
List<Integer> list = new ArrayList<Integer>();
for (int i=0; i<n; i++) list.add(i);
Collections.shuffle(list);
我不太确定这些东西对你来说是否会太难,只是希望能再多刺激你一下 (笑)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.114.78.231
※ 编辑: tkcn 来自: 140.114.78.231 (10/17 01:40)
1F:→ eieio:这个洗法不乾净吧,应该是依序和"自己或後面" random 位置换 10/17 07:34
2F:推 JazzChen:摁...很刺激XD但是有点太难有很多的不懂.. 10/17 15:05