乐透抽奖模拟

程序演示:输入五个抽奖数(quickpick复选框为快速生成,personal为自己编辑),点击play程序开始,中奖情况统计在下方,默认每周开一次大乐透,drawings表示开奖次数。

源程序包括界面类文件和事件类文件。

界面类LottoMadness: 

import java.awt.*;
import javax.swing.*;

public class LottoMadness extends JFrame {
    LottoEvent lotto  = new LottoEvent(this);

    JPanel row1 = new JPanel();
    ButtonGroup option = new ButtonGroup();
    JCheckBox quickpick = new JCheckBox("quickpick",false);
    JCheckBox personal = new JCheckBox("personal",true);

    JPanel row2 = new JPanel();
    JLabel numbersLabel = new JLabel("Your picks : ", JLabel.RIGHT);
    JTextField[] numbers = new JTextField[6];
    JLabel winnersLabel = new JLabel("winners: " , JLabel.RIGHT);
    JTextField[] winners = new JTextField[6];

    JPanel row3 = new JPanel();
    JButton stop = new JButton("stop");
    JButton play = new JButton("play");
    JButton reset = new JButton("reset");

    JPanel row4 = new JPanel();
    JLabel got3Label = new JLabel("3 of 6 :",JLabel.RIGHT);
    JTextField got3 = new JTextField("0");
    JLabel got4Label = new JLabel("4 of 6 :",JLabel.RIGHT);
    JTextField got4 = new JTextField("0");
    JLabel got5Label = new JLabel("5 of 6 :",JLabel.RIGHT);
    JTextField got5 = new JTextField("0");
    JLabel got6Label = new JLabel("6 of 6 :",JLabel.RIGHT);
    JTextField got6 = new JTextField("0");
    JLabel drawingsLabel = new JLabel("drawings :",JLabel.RIGHT);
    JTextField drawings = new JTextField("0");
    JLabel yearsLabel = new JLabel("years :",JLabel.RIGHT);
    JTextField years = new JTextField("0");

    public LottoMadness(){
        super("Lotto Madness");
        setSize(550, 260);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        GridLayout layout = new GridLayout(5,1,10,10);
        setLayout(layout);

        quickpick.addItemListener(lotto);
        personal.addItemListener(lotto);
        stop.addActionListener(lotto);
        play.addActionListener(lotto);
        reset.addActionListener(lotto);

        FlowLayout layout1 = new FlowLayout(FlowLayout.CENTER, 10, 10);
        option.add(quickpick);
        option.add(personal);
        row1.setLayout(layout1);
        row1.add(quickpick);
        row1.add(personal);
        add(row1);

        GridLayout layout2 = new GridLayout(2, 7 ,10, 10);
        row2.setLayout(layout2);
        row2.add(numbersLabel);
        for (int i =0 ;i<6; i++){
            numbers[i] = new JTextField();
            row2.add(numbers[i]);
        }
        row2.add(winnersLabel);
        for (int i=0; i<6; i++){
            winners[i]=new JTextField();
            winners[i].setEnabled(false);
            row2.add(winners[i]);
        }
        add(row2);

        FlowLayout layout3 = new FlowLayout(FlowLayout.CENTER, 10, 10);
        row3.setLayout(layout3);
        stop.setEnabled(false);
        row3.add(stop);
        row3.add(play);
        row3.add(reset);
        add(row3);

        GridLayout layout4 = new GridLayout(2, 3, 20, 10);
        row4.setLayout(layout4);
        row4.add(got3Label);
        got3.setEditable(false);
        row4.add(got3);
        row4.add(got4Label);
        got4.setEditable(false);
        row4.add(got4);
        row4.add(got5Label);
        got5.setEditable(false);
        row4.add(got5);
        row4.add(got6Label);
        got6.setEditable(false);
        row4.add(got6);
        row4.add(drawingsLabel);
        drawings.setEditable(false);
        row4.add(drawings);
        row4.add(yearsLabel);
        years.setEditable(false);
        row4.add(years);
        add(row4);

        setVisible(true);

    }

    public static void main (String[] arguments){
        LottoMadness frame = new LottoMadness();
    }

}

事件类LottoEvent:

import javax.swing.*;
import java.awt.event.*;

public class LottoEvent implements ItemListener, ActionListener, Runnable {
    LottoMadness gui;  //why no import LottoMadness;
    Thread playing;

    public LottoEvent(LottoMadness in){
        gui = in;
    }

    public void actionPerformed(ActionEvent event){
        String command = event.getActionCommand();
        if(command == "play"){
            startPlaying();
        }
        if(command == "stop"){
            stopPlaying();
        }
        if(command == "reset"){
            clearAllField();
        }
    }

    void startPlaying(){
        playing = new Thread(this);
        playing.start();
        gui.play.setEnabled(false);
        gui.stop.setEnabled(true);
        gui.reset.setEnabled(false);
        gui.quickpick.setEnabled(false);
        gui.personal.setEnabled(false);

    }

    void stopPlaying() {
        gui.stop.setEnabled(false);
        gui.play.setEnabled(true);
        gui.reset.setEnabled(true);
        gui.quickpick.setEnabled(true);
        gui.personal.setEnabled(true);
        playing = null;
    }

    void clearAllField() {
        for (int i = 0; i<6; i++){
            gui.numbers[i].setText(null);
            gui.winners[i].setText(null);

        }
        gui.got3.setText("0");
        gui.got4.setText("0");
        gui.got5.setText("0");
        gui.got6.setText("0");
        gui.drawings.setText("0");
        gui.years.setText("0");
    }

    public void itemStateChanged(ItemEvent event) {
        Object item = event.getItem();
        if(item ==gui.quickpick){
            for(int i=0; i<6; i++){
                int pick;
                do{
                    pick = (int)Math.floor(Math.random()*50 + 1);
                }while(numberGone(pick,gui.numbers,i)); //To guarantee the numbers are different;
                gui.numbers[i].setText(""+ pick);
            }
        }else{
            for(int i = 0; i<6; i++){
                gui.numbers[i].setText(null);  //the differences between "" and null here;
            }
        }
    }

    void addOneToField(JTextField field){
        int num = Integer.parseInt("0"+field.getText());
        num++;
        field.setText(""+num);

    }

    boolean numberGone(int num, JTextField[] pastNums, int count){
        for(int i=0; i<count; i++){
            if(Integer.parseInt(pastNums[i].getText() )== num){
                return true;
            }

        }
        return false;
    }

    boolean matchedOne(JTextField win, JTextField[] allPicks){
        for(int i=0; i<6; i++){
            String winText = win.getText();
            if (winText.equals(allPicks[i].getText())){
                return true;
            }
        }
        return false;
    }

    public void run() {
        Thread thisThread = Thread.currentThread();  //why not new thread?
        while(playing == thisThread){
            addOneToField(gui.drawings);
            int draw = Integer.parseInt(gui.drawings.getText());
            float numYears = (float)draw/52;  //once a week;
            gui.years.setText(""+numYears);

            int matches = 0;
            for(int i= 0; i<6; i++){
                int ball;
                do{
                    ball = (int)Math.floor(Math.random()*50 +1 );
                }while(numberGone(ball, gui.winners, i));
                gui.winners[i].setText(""+ball);  //why "". to change an Integer to string;
                if(matchedOne(gui.winners[i], gui.numbers)){
                    matches++;
                }

            }

            switch(matches) {
                case 3:
                    addOneToField(gui.got3);
                    break;
                case 4:
                    addOneToField(gui.got4);
                    break;
                case 5:
                    addOneToField(gui.got5);
                case 6:
                    addOneToField(gui.got6);
                    gui.stop.setEnabled(false);
                    gui.play.setEnabled(true);
                    playing = null;

            }
            try {
                Thread.sleep(100);
            }catch(InterruptedException e){

            }
        }

    }
}

 

 

乐透是一种彩票游戏,其结果是完全随机且无规律的,理论上无法通过遗传模拟等方式准确预测。不过可以从模拟算法的角度来进行所谓的“遗传模拟”,以下是一个简单的基于Python实现大乐透遗传模拟的示例思路及代码: ### 思路 1. 定义个体:每个个体代表一组大乐透号码。 2. 初始化种群:随机生成一定数量的个体组成初始种群。 3. 适应度评估:这里简单假设与历史中奖号码匹配的数字越多适应度越高。 4. 选择:根据适应度选择部分个体作为父代。 5. 交叉:对父代个体进行交叉操作生成子代。 6. 变异:对子代个体进行变异操作。 7. 迭代更新种群,直到达到指定的迭代次数。 ### 代码示例 ```python import random # 大乐透规则:前 1 - 35 选 5,后 1 - 12 选 2 def generate_lottery_number(): front = random.sample(range(1, 36), 5) front.sort() back = random.sample(range(1, 13), 2) back.sort() return front + back # 初始化种群 def initialize_population(pop_size): return [generate_lottery_number() for _ in range(pop_size)] # 适应度评估 def fitness(individual, winning_number): front_match = len(set(individual[:5]).intersection(set(winning_number[:5]))) back_match = len(set(individual[5:]).intersection(set(winning_number[5:]))) return front_match + back_match # 选择操作 def selection(population, winning_number): fitness_scores = [fitness(ind, winning_number) for ind in population] total_fitness = sum(fitness_scores) selection_probs = [score / total_fitness for score in fitness_scores] selected_indices = random.choices(range(len(population)), weights=selection_probs, k=len(population) // 2) return [population[i] for i in selected_indices] # 交叉操作 def crossover(parent1, parent2): crossover_point = random.randint(1, 6) child = parent1[:crossover_point] + [num for num in parent2 if num not in parent1[:crossover_point]] child = child[:5] + sorted([num for num in child[5:] if num in range(1, 13)][:2]) return child # 变异操作 def mutation(individual): index = random.randint(0, 6) if index < 5: new_num = random.randint(1, 35) while new_num in individual[:5]: new_num = random.randint(1, 35) individual[index] = new_num individual[:5].sort() else: new_num = random.randint(1, 12) while new_num in individual[5:]: new_num = random.randint(1, 12) individual[index] = new_num individual[5:].sort() return individual # 遗传模拟主函数 def genetic_simulation(pop_size, generations, winning_number): population = initialize_population(pop_size) for _ in range(generations): parents = selection(population, winning_number) offspring = [] while len(offspring) < pop_size - len(parents): parent1, parent2 = random.sample(parents, 2) child = crossover(parent1, parent2) if random.random() < 0.1: # 变异概率 10% child = mutation(child) offspring.append(child) population = parents + offspring best_individual = max(population, key=lambda ind: fitness(ind, winning_number)) return best_individual # 示例使用 pop_size = 100 generations = 50 winning_number = generate_lottery_number() best_number = genetic_simulation(pop_size, generations, winning_number) print("模拟得到的最佳号码:", best_number) ``` ### 注意事项 需要强调的是,大乐透的结果是随机的,这种遗传模拟并不能保证预测出中奖号码,只是一种算法上的模拟探索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值