㈠ java集五福活动概率技术如何实现
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Random;
/**
*抽奖工具类,概率和可以不等于1
*概率为百分数去掉百分号的部分,如%,则为10
*抽奖操作如下:
*1.输入抽奖概率集合,【抽奖概率集合为{10.0,20.0,30.0}】
*2.生成连续集合,【生成的连续集合为{(0.0,10.0],(10.0,30.0],(30.0,60.0]}】
*3.生成随机数,【生成方法为random.nextDouble()*maxElement】
*4.判断随机数在哪个区间内,返回该区间的index【生成了随机数12.001,则它属于(10.0,30.0],返回index=1】
*
*/
publicclassLotteryUtil{
/**
*定义一个连续集合
*集合中元素x满足:(minElement,maxElement]
*数学表达式为:minElement<x<=maxElement
*
*/
publicclassContinuousList{
privatedoubleminElement;
privatedoublemaxElement;
publicContinuousList(doubleminElement,doublemaxElement){
if(minElement>maxElement){
("区间不合理,minElement不能大于maxElement!");
}
this.minElement=minElement;
this.maxElement=maxElement;
}
/**
*判断当前集合是否包含特定元素
*@paramelement
*@return
*/
publicbooleanisContainKey(doubleelement){
booleanflag=false;
if(element>minElement&&element<=maxElement){
flag=true;
}
returnflag;
}
}
privateList<ContinuousList>lotteryList;//概率连续集合
privatedoublemaxElement;//这里只需要最大值,最小值默认为0.0
/**
*构造抽奖集合
*@paramlist为奖品的概率
*/
publicLotteryUtil(List<Double>list){
lotteryList=newArrayList<ContinuousList>();
if(list.size()==0){
("抽奖集合不能为空!");
}
doubleminElement=0d;
ContinuousListcontinuousList=null;
for(Doubled:list){
minElement=maxElement;
maxElement=maxElement+d;
continuousList=newContinuousList(minElement,maxElement);
lotteryList.add(continuousList);
}
}
/**
*进行抽奖操作
*返回:奖品的概率list集合中的下标
*/
publicintrandomColunmIndex(){
intindex=-1;
Randomr=newRandom();
doubled=r.nextDouble()*maxElement;//生成0-1间的随机数
if(d==0d){
d=r.nextDouble()*maxElement;//防止生成0.0
}
intsize=lotteryList.size();
for(inti=0;i<size;i++){
ContinuousListcl=lotteryList.get(i);
if(cl.isContainKey(d)){
index=i;
break;
}
}
if(index==-1){
("概率集合设置不合理!");
}
returnindex;
}
publicdoublegetMaxElement(){
returnmaxElement;
}
publicList<ContinuousList>getLotteryList(){
returnlotteryList;
}
publicvoidsetLotteryList(List<ContinuousList>lotteryList){
this.lotteryList=lotteryList;
}
}
该工具类的基本思想是,将抽奖概率分布到数轴上,如现有三个抽奖概率10、20、30,将三者依次添加到概率集合中,则构造的数轴为:0~10范围内表示概率10,10~30范围内表示概率为20,30~60范围内表示概率为30,数轴上的长度对应着相应的概率。由这种处理方式可知,概率总和并不需要等于1。该工具类的成功与否在于Random.nextDouble()能否等概率地生成0~1之间的任意一个数。
对该抽奖工具进行测试,测试类如下:
[java]view plain
packagecom.lottery;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importjava.util.Map.Entry;
classResult{
privateintindex;
privateintsumTime;
privateinttime;
privatedoubleprobability;
privatedoublerealProbability;
publicintgetIndex(){
returnindex;
}
publicvoidsetIndex(intindex){
this.index=index;
}
publicintgetTime(){
returntime;
}
publicvoidsetTime(inttime){
this.time=time;
}
publicintgetSumTime(){
returnsumTime;
}
publicvoidsetSumTime(intsumTime){
this.sumTime=sumTime;
}
publicdoublegetProbability(){
returnprobability;
}
(){
returnrealProbability;
}
publicvoidsetRealProbability(doublerealProbability){
this.realProbability=realProbability;
}
publicResult(){
}
publicResult(intindex,intsumTime,inttime,doublerealProbability){
this.setIndex(index);
this.setTime(time);
this.setSumTime(sumTime);
this.setRealProbability(realProbability);
}
publicStringtoString(){
return"索引值:"+index+",抽奖总数:"+sumTime+",抽中次数:"+time+",概率:"
+realProbability+",实际概率:"+(double)time/sumTime;
}
}
publicclassTestLottery{
staticfinalintTIME=100000;
publicstaticvoiditeratorMap(Map<Integer,Integer>map,List<Double>list){
for(Entry<Integer,Integer>entry:map.entrySet()){
intindex=entry.getKey();
inttime=entry.getValue();
Resultresult=newResult(index,TIME,time,list.get(index));
System.out.println(result);
}
}
publicstaticvoidmain(String[]args){
//构造概率集合
List<Double>list=newArrayList<Double>();
list.add(20d);
list.add(80d);
list.add(50d);
list.add(30d);
LotteryUtilll=newLotteryUtil(list);
doublesumProbability=ll.getMaxElement();
Map<Integer,Integer>map=newHashMap<Integer,Integer>();
for(inti=0;i<TIME;i++){
intindex=ll.randomColunmIndex();
if(map.containsKey(index)){
map.put(index,map.get(index)+1);
}else{
map.put(index,1);
}
}
for(inti=0;i<list.size();i++){
doubleprobability=list.get(i)/sumProbability;
list.set(i,probability);
}
iteratorMap(map,list);
}
}
运行结果:
由结果可知,抽奖100000时, 得到的实际概率基本与正式概率相当。
以下说明此类调用方式:
[java]view plain
publicLotteryUtil(List<Double>list)
说明:构造方法,传入参数为一个概率集合
[java]view plain
publicintrandomColunmIndex()
功能:进行抽奖操作,返回List集合的索引下标,此下标对应的概率的奖品即为抽中的奖品
㈡ 求java算法:根据物品的数量来确定抽奖的概率(当物品数量为0时无论如何都不可能选到)
public class Lottery {
private int m = 1000;//发放奖券的数量
private int n = 2;//奖品的数量
public boolean getLottery(){
boolean isLottery = false;
double d = (double)n/(double)m;//中奖概率
double r = Math.random();//0~1之间的随机数,包括0
if(r<d){//如果随版机数小于权概率 那么中奖
n--;//奖品数量-1
isLottery = true;
}
m--;//奖券数量-1
return isLottery;
}
}
㈢ java抽奖程序,可设置不同奖品获得概率
importjava.awt.EventQueue;
importjava.awt.TextArea;
importjava.awt.TextField;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.util.Random;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
importjavax.swing.JTextArea;
importjavax.swing.JTextField;
importjavax.swing.border.EmptyBorder;
{
privateJPanelcontentPane;
privateJTextFieldtextFieldA;
privateJTextFieldtextFieldB;
privateJTextFieldtextFieldC;
privateTextFieldtextField;
;
privateJTextAreatextArea;
/**
*Launchtheapplication.
*/
publicstaticvoidmain(String[]args){
.invokeLater(newRunnable(){
publicvoidrun(){
try{
LuckySelectframe=newLuckySelect();
frame.setVisible(true);
}catch(Exceptione){
e.printStackTrace();
}
}
});
}
/**
*Createtheframe.
*/
publicLuckySelect(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100,100,450,251);
contentPane=newJPanel();
contentPane.setBorder(newEmptyBorder(5,5,5,5));
contentPane.setLayout(null);
setContentPane(contentPane);
JLabellblA=newJLabel("A");
lblA.setBounds(10,128,54,15);
contentPane.add(lblA);
JLabellblB=newJLabel("B");
lblB.setBounds(124,128,54,15);
contentPane.add(lblB);
JLabellblC=newJLabel("C");
lblC.setBounds(254,128,54,15);
contentPane.add(lblC);
textFieldA=newJTextField();
textFieldA.setBounds(30,125,66,21);
contentPane.add(textFieldA);
textFieldA.setColumns(10);
textFieldB=newJTextField();
textFieldB.setColumns(10);
textFieldB.setBounds(149,125,66,21);
contentPane.add(textFieldB);
textFieldC=newJTextField();
textFieldC.setColumns(10);
textFieldC.setBounds(264,125,66,21);
contentPane.add(textFieldC);
textField=newTextField();
textField.setBounds(98,167,157,21);
contentPane.add(textField);
textField.setColumns(10);
textFieldResult=newJTextField();
textFieldResult.setBounds(280,167,66,21);
contentPane.add(textFieldResult);
textFieldResult.setColumns(10);
textFieldA.setText("10");
textFieldB.setText("10");
textFieldC.setText("10");
JButtonbutton=newJButton("u62BDu5956");
button.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
select();
}
});
button.setBounds(0,166,93,23);
contentPane.add(button);
textArea=newJTextArea();
textArea.setBounds(30,31,306,83);
contentPane.add(textArea);
}
protectedvoidselect(){
//TODOAuto-generatedmethodstub
intaNum=Integer.decode(textFieldA.getText());
intbNum=Integer.decode(textFieldB.getText());
intcNum=Integer.decode(textFieldB.getText());
Randomr=newRandom();
intrandom=r.nextInt(aNum+bNum+cNum);
if(random<=aNum){
textFieldA.setText(Integer.toString(Integer.decode(textFieldA.getText())-1));
textArea.append(Integer.toString(random)+"抽中了A ");
}elseif(random<=aNum+bNum){
textFieldB.setText(Integer.toString(Integer.decode(textFieldB.getText())-1));
textArea.append(Integer.toString(random)+"抽中了B ");
}elseif(random<=aNum+bNum+cNum){
textFieldC.setText(Integer.toString(Integer.decode(textFieldC.getText())-1));
textArea.append(Integer.toString(random)+"抽中了C ");
}
}
}
㈣ Java代码实现抽奖:从班级的学号中抽出一个一等奖,两个二等奖,三个三等奖
抽取问题, 重点是 同一个学号不能重复被抽取.
解决办法很多,
比如数组可以使用下标来标记,号码是否被使用,使用了就继续下一次抽取
也可以使用集合来抽取,把集合顺序打乱,然后随便抽几个就可以了
参考代码:数组法
importjava.util.Random;
publicclassTest{
publicstaticvoidmain(String[]args){
intstuNums=30;
int[]nums=newint[stuNums];//存储学号的数组
boolean[]flags=newboolean[stuNums];//标记,用于标记对应下标的学号是否已经被抽取过了
for(inti=0;i<stuNums;i++){
nums[i]=i+1;//给学号赋值
}
Randomr=newRandom();
while(true){
intindex=r.nextInt(stuNums);
if(!flags[index]){
System.out.println("A等:"+nums[index]);
flags[index]=true;//标记已经被使用过了
break;
}
}
for(inti=0;i<2;i++){
intindex=r.nextInt(stuNums);
if(!flags[index]){
System.out.println("B等:"+nums[index]);
flags[index]=true;
}else{
i--;//如果已经被抽取过了,那么i建议,再次循环
}
}
for(inti=0;i<3;i++){
intindex=r.nextInt(stuNums);
if(!flags[index]){
System.out.println("c等:"+nums[index]);
flags[index]=true;
}else{
i--;
}
}
}
}
集合法
importjava.util.ArrayList;
importjava.util.Collections;
publicclassTest2{
publicstaticvoidmain(String[]args){
intstuNums=20;
ArrayList<Integer>list=newArrayList<Integer>();
for(inti=0;i<stuNums;i++){
list.add(i+1);
}
System.out.println("有序"+list);
Collections.shuffle(list);//打乱顺序
System.out.println("乱序"+list);
System.out.println("A等"+list.get(0));
System.out.println("B等"+list.get(1));
System.out.println("B等"+list.get(2));
System.out.println("C等"+list.get(3));
System.out.println("C等"+list.get(4));
System.out.println("C等"+list.get(5));
}
}
㈤ 这个幸运大抽奖的java项目代码,怎么编写呢
public class Test {
public static void main(String[] args) {
int chance = 100;// 中奖概率,百分之1就是100,千分之一就是1000
double b = Math.random() * chance;
int i = (int) b;
if (i < 1) {
System.out.println("中奖");
}
}
}