今天在上看到一个抽奖的小算法,与大家分享

重返IT路 2008-11-17 09:16:09
题目:
有1~100个号码,抽取7个号码获奖。不能抽取重复的号码

解题思路:
常规思路:
1.用Math.random()方法抽取一个数来
2.判断这个数是否已被抽取过,若是则重新抽取。

书上思路:
用一数组存放100个数
int n = 100;
int[] number = new int[n]
for(int i=0;i<n;i++)
number[i]=i+1;

再用一数组存放结果
int[] result = new int[7];

随机抽取7个数将结果号码放到result数组中,并判断重复
for(int i=0;i<7;i++)
{
index=Math.random()×n;
result[i]=number[index];
number[index]=number[--n];//把已经抽到的号码和最后一个数交换,并且在算随机数时不包含最后数的索引值就实现了判断重复
}


-----------------------------
本人刚学习JAVA一星期,有什么地方请各位大侠多指点~
...全文
509 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
微笑浅浅 2011-07-11
  • 打赏
  • 举报
回复
喔,明白了。
微笑浅浅 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gmh521 的回复:]
Math.random()方法产生一个0-1之间的数不包括1所以最后一个数抽不到!
[/Quote]
result [i] = number[index];
这个不是下标嘛,不是可以取到 number[99] 不就是最后一个数了?

这个算法我还是没有明白,如果第一次就取到index=99,那还怎么交换啊
q498110112 2011-04-29
  • 打赏
  • 举报
回复
最近遇到个问题 在一定范围内的序列号中进行抽奖 这个谁能给解决
老紫竹 2008-11-20
  • 打赏
  • 举报
回复
交换确实可以解决掉重复的问题,这个我前段时间整理过,确实是很有趣的思路
无重复随机数
bigbro001 2008-11-20
  • 打赏
  • 举报
回复
楼主C/C++的基础很好吧,一个礼拜就可以写这么多东西出来了,又是五子棋又是抽奖的
重返IT路 2008-11-20
  • 打赏
  • 举报
回复
这道题在 <THINKING IN JAVA>中也有描述

他有一个另外的算法也很不错:

开辟一个BOOLEAN数组,数组的下标就是数。 里面的值是TRUE就是被抽到过 FALSE是没被抽到
每次抽一数,然后到那BOOLEAN数组看是否被到过就可以了

觉得这种方法跟简单
重返IT路 2008-11-20
  • 打赏
  • 举报
回复
恩 学过C 自学过C++

JAVA刚开始学
zhengpeiyong 2008-11-20
  • 打赏
  • 举报
回复
顶,新奇
重返IT路 2008-11-20
  • 打赏
  • 举报
回复
谢谢JAVA2000了~ 以后有问题小生虚心向你请教
重返IT路 2008-11-19
  • 打赏
  • 举报
回复
我的算法 是用空间换时间
你的算法是常规的遍历结果数组实现不抽重复数字(如果数很多且要抽很多数,效率就不高了)

但我想抽奖 最多抽10多个吧 呵呵
重返IT路 2008-11-19
  • 打赏
  • 举报
回复
各位不好意思啊 有个忘写了
index=(int)Math.random()×n;
这个要处理一下

还有 那个是没交换,只是把末尾的数覆盖掉了抽到的数
z119273835 2008-11-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Akmvp 的回复:]
number[index]=number[--n];//把已经抽到的号码和最后一个数交换,并且在算随机数时不包含最后数的索引值就实现了判断重复
那只是把最后的数赋给抽到的数吧,貌似他们没有交换
[/Quote]同意 但这样就有了
allvictory 2008-11-17
  • 打赏
  • 举报
回复
哈哈,这样一想,发现原来的是对的, index=Math.random()×n;
根本就不用抽到100
allvictory 2008-11-17
  • 打赏
  • 举报
回复
index=1+Math.random()×n;
result[i]=number[--index];
number[--index]=number[--n];
这样就行了
Akmvp 2008-11-17
  • 打赏
  • 举报
回复
照你代码那么,开始的时候是抽不到100吧
如果按照3楼那样改的话
那么把开始抽到100赋给100
那样也会重复啊
楼主的代码开始抽不到100
然后下一轮赋值出去就可能抽到了吧!这轮抽不到99
下一轮99交换出去
那么最后的那7个号码的发生的概率应该低了点
不知道我理解有没错,请高手指点

shenjie1989 2008-11-17
  • 打赏
  • 举报
回复
import java.util.*;

public class LotteryDrawing {
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
System.out.print("How many numbers doyou need to draw?");
int k = in.nextInt();
System.out.print("What is the highest number you can draw");
int n = in.nextInt();
int[] numbers = new int[n];
for (int i = 0; i < numbers.length; i++)
numbers[i] = i + 1;
int[] result = new int[k];
for (int i = 0; i < result.length; i++) {
int r = (int) (Math.random() * n);
result[i] = numbers[r];
numbers[r] = numbers[n - 1];
n--;
}
Arrays.sort(result);
System.out.println("Bet the following combination.I will male you rich!");
for (int r : result)
System.out.println(r);

}

}
sunxing007 2008-11-17
  • 打赏
  • 举报
回复
如果是我我会这么做.
用数组存放这100个号码(他们不应该出现重复).
用length为7的数组存放重奖号码的角标.
每生成一个角标(1~100), 就判断一下有没有重复.
Akmvp 2008-11-17
  • 打赏
  • 举报
回复
number[index]=number[--n];//把已经抽到的号码和最后一个数交换,并且在算随机数时不包含最后数的索引值就实现了判断重复
那只是把最后的数赋给抽到的数吧,貌似他们没有交换
allvictory 2008-11-17
  • 打赏
  • 举报
回复
额 好象应该是index=1+Math.random()×n;
gmh521 2008-11-17
  • 打赏
  • 举报
回复
Math.random()方法产生一个0-1之间的数不包括1所以最后一个数抽不到!
加载更多回复(1)

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧