Java亂數抽籤程式

在很多場合都會用到抽籤功能,傳統的有用竹筷子上面寫數字放入籤筒裡來取得,還有用紙張寫數字折起來來取出需求數字,不過這些方法都可能會有人為的干擾,最好的方式還是交由程式來取得亂數,當做抽籤結果,以求公平。

這個範例是利用Java亂數來製作的一個抽籤程式,可以選擇是否取數時可允許重覆的數值取得。畫面如下:

RndApp1.jpg

程式碼如下:

package rndApp;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Toolkit;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JList;
import javax.swing.JTextField;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JCheckBox;
import java.awt.event.KeyEvent;
import javax.swing.BorderFactory;
import javax.swing.JFormattedTextField;
import javax.swing.SwingConstants;
public class RndFrame extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JScrollPane jScrollPane = null;
private JTextArea jTextArea = null;
private JList jList = null;
private JTextField rndText = null;
private JButton jButton = null;
private JButton jButton1 = null;
private JLabel jLabel = null;
private JCheckBox jCheckBox = null;
private JFormattedTextField jFormattedTextField = null;
// 最大數
private int maxNum = 50;
// 是否重新取數
private boolean reRnd = false;
// 目前取到的數count
private int count = 0;
// 存放值
private int[] Num = null;
// 亂數種子
private java.util.Random r = new java.util.Random(); // @jve:decl-index=0:
private JLabel jLabel1 = null;
private JLabel jLabel2 = null;
private JLabel label_max = null;
private JLabel jLabel4 = null;
private JLabel label_rernd = null;
private JButton jButton2 = null;
/**
* This is the default constructor
*/
public RndFrame() {
super();
initialize();
}
private void setMaxNum(int maxNum) {
this.maxNum = maxNum;
}
private void setReRnd(boolean b) {
this.reRnd = b;
}
private void initNum() {
count = 0;
Num = new int[maxNum];
for (int i = 0; i < maxNum; i++) {
Num[i] = i + 1;
}
}
public void setRndText() {
if (maxNum - count > 0) {
int rnd = r.nextInt(maxNum - count);
String str = String.valueOf(Num[rnd]);
this.getRndText().setText(str);
this.getJTextArea().append(str + "\n");
if (reRnd == false) {
// 如果是不能重覆的話,那把值跟最後一個最交換,
// 然後設定count++不再取到它
int tmp = Num[rnd];
Num[rnd] = Num[maxNum - 1 - count];
Num[maxNum - 1 - count] = tmp;
count++;
}
}
}
public void setReset() {
this.setMaxNum(Integer
.parseInt(this.getJFormattedTextField().getText()));
initNum();
this.setReRnd(this.jCheckBox.isSelected());
// 元件回復狀況
this.getJTextArea().setText("");
this.label_max.setText(this.getJFormattedTextField().getText());
this.label_rernd.setText(this.jCheckBox.isSelected() == true ? "是"
: "否");
}
/**
* This method initializes this
* 
* @return void
*/
private void initialize() {
initNum();
this.setSize(400, 300);
this.setName("jFrame");
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setContentPane(getJContentPane());
this.setTitle("抽籤程式");
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation(screenSize.width / 2 - this.getWidth() / 2,
screenSize.height / 2 - this.getHeight() / 2);
this.setVisible(true);
}
/**
* This method initializes jContentPane
* 
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
label_rernd = new JLabel();
label_rernd.setBounds(new Rectangle(58, 50, 45, 18));
label_rernd.setHorizontalTextPosition(SwingConstants.TRAILING);
label_rernd.setHorizontalAlignment(SwingConstants.CENTER);
label_rernd.setText("否");
jLabel4 = new JLabel();
jLabel4.setBounds(new Rectangle(3, 50, 55, 18));
jLabel4.setText("重覆取數");
label_max = new JLabel();
label_max.setBounds(new Rectangle(58, 30, 44, 16));
label_max.setHorizontalAlignment(SwingConstants.CENTER);
label_max.setText("50");
jLabel2 = new JLabel();
jLabel2.setBounds(new Rectangle(2, 30, 60, 16));
jLabel2.setText("最大人數");
jLabel1 = new JLabel();
jLabel1.setBounds(new Rectangle(2, 10, 68, 16));
jLabel1.setText("目前設定值");
jLabel = new JLabel();
jLabel.setBounds(new Rectangle(18, 123, 127, 33));
jLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
jLabel.setFont(new Font("Dialog", Font.BOLD, 24));
jLabel.setDisplayedMnemonic(KeyEvent.VK_UNDEFINED);
jLabel.setText("最大人數:");
jContentPane = new JPanel();
jContentPane.setLayout(null);
// jContentPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0,
// 0));
jContentPane.add(getJScrollPane(), null);
jContentPane.add(getJList(), null);
jContentPane.add(getRndText(), null);
jContentPane.add(getJButton(), null);
jContentPane.add(getJButton1(), null);
jContentPane.add(jLabel, null);
jContentPane.add(getJCheckBox(), null);
jContentPane.add(getJFormattedTextField(), null);
jContentPane.add(jLabel1, null);
jContentPane.add(jLabel2, null);
jContentPane.add(label_max, null);
jContentPane.add(jLabel4, null);
jContentPane.add(label_rernd, null);
jContentPane.add(getJButton2(), null);
}
return jContentPane;
}
/**
* This method initializes jScrollPane
* 
* @return javax.swing.JScrollPane
*/
private JScrollPane getJScrollPane() {
if (jScrollPane == null) {
jScrollPane = new JScrollPane();
jScrollPane.setBounds(new Rectangle(308, 2, 82, 264));
jScrollPane.setViewportView(getJTextArea());
}
return jScrollPane;
}
/**
* This method initializes jTextArea
* 
* @return javax.swing.JTextArea
*/
private JTextArea getJTextArea() {
if (jTextArea == null) {
jTextArea = new JTextArea();
}
return jTextArea;
}
/**
* This method initializes jList
* 
* @return javax.swing.JList
*/
private JList getJList() {
if (jList == null) {
jList = new JList();
jList.setBounds(new Rectangle(5, 101, 302, 8));
}
return jList;
}
/**
* This method initializes rndText
* 
* @return javax.swing.JTextField
*/
private JTextField getRndText() {
if (rndText == null) {
rndText = new JTextField();
rndText.setBounds(new Rectangle(103, 8, 112, 88));
rndText.setFont(new Font("Dialog", Font.PLAIN, 66));
rndText.setHorizontalAlignment(JTextField.CENTER);
rndText.setText("");
}
return rndText;
}
/**
* This method initializes jButton
* 
* @return javax.swing.JButton
*/
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setBounds(new Rectangle(215, 64, 90, 32));
jButton.setText("取數");
jButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
RndFrame frame = ((RndFrame) ((JButton) e.getSource())
.getTopLevelAncestor());
frame.setRndText();
}
});
}
return jButton;
}
/**
* This method initializes jButton1
* 
* @return javax.swing.JButton
*/
private JButton getJButton1() {
if (jButton1 == null) {
jButton1 = new JButton();
jButton1.setBounds(new Rectangle(57, 193, 90, 35));
jButton1.setText("設定");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
RndFrame frame = ((RndFrame) ((JButton) e.getSource())
.getTopLevelAncestor());
frame.setReset();
}
});
}
return jButton1;
}
/**
* This method initializes jCheckBox
* 
* @return javax.swing.JCheckBox
*/
private JCheckBox getJCheckBox() {
if (jCheckBox == null) {
jCheckBox = new JCheckBox();
jCheckBox.setBounds(new Rectangle(18, 159, 237, 30));
jCheckBox.setFont(new Font("Dialog", Font.BOLD, 24));
jCheckBox.setText("是否可以重覆取數");
}
return jCheckBox;
}
/**
* This method initializes jFormattedTextField
* 
* @return javax.swing.JFormattedTextField
*/
private JFormattedTextField getJFormattedTextField() {
if (jFormattedTextField == null) {
javax.swing.text.NumberFormatter mf2 = null;
mf2 = new javax.swing.text.NumberFormatter();
mf2.setMaximum(new Integer(500));
mf2.setMinimum(new Integer(0));
jFormattedTextField = new JFormattedTextField(mf2);
jFormattedTextField.setBounds(new Rectangle(151, 123, 119, 33));
jFormattedTextField.setHorizontalAlignment(JTextField.CENTER);
jFormattedTextField.setText("50");
jFormattedTextField.setFont(new Font("Dialog", Font.PLAIN, 24));
}
return jFormattedTextField;
}
/**
* This method initializes jButton2
* 
* @return javax.swing.JButton
*/
private JButton getJButton2() {
if (jButton2 == null) {
jButton2 = new JButton();
jButton2.setBounds(new Rectangle(229, 237, 76, 24));
jButton2.setText("關於");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
RndFrame frame = ((RndFrame) ((JButton) e.getSource())
.getTopLevelAncestor());
javax.swing.JOptionPane.showMessageDialog(frame,
"blog.yslifes.com\r\nPower by yku");
}
});
}
return jButton2;
}
public static void main(String[] args) {
new RndFrame();
}
} // @jve:decl-index=0:visual-constraint="10,10"

程式碼下載

Jar Run程式,可直接執行

用法說明:

下方可設定取數的範圍為1到某個數中間(最大人數),取數過程是否可取到重覆的數字,選擇好後按下”設定”按鈕可以看到左上角設定值已被更改,再來按下按鈕”取數”可於中間TextField看到取到的數字為何,而右側會顯示歷史記錄。

RndApp2.jpg

ps.其實這程式的亂數還有很大的改進空間,有興趣的朋友可以自己再做些修改。

13 thoughts to “Java亂數抽籤程式”

  1. 不好意思~最近剛好需要抽籤產生器
    我下載了RndApp.zip
    但是裡面找不到可以開始的程式
    請問是需要安裝什麼軟體才能開啓嗎??

    謝謝你的回覆!!

  2. 大大你好 想要學習大大的程式教學 我用netbeans 要像你這樣跑出一個軟體來要怎用 然後圖形怎用進去阿 謝謝你的回覆!!

  3. 站長好:

    由於我也是沒出現該出現的抽籤程式
    故請教站長
    我的作業系統是win7+64位元

    同時下載站長的RndApp.jar、Random1.2.jar (安裝在C槽內的默認位置)
    https://skydrive.live.com/?cid=0c2a0afafc5ad85d&id=C2A0AFAFC5AD85D!782&authkey=!

    然後也去下載了JDK (版本:Windows x64) (放置在C槽內的新開資料夾)
    http://www.oracle.com/technetwork/java/javase/downloads/index.html

    以上兩件事情都完成了 也重新開機了
    但就是點了.jar檔 卻都會跑進去資料夾內
    (照道理說應該要執行抽籤程式的)
    請問不知道站長這是為什麼呢?!

    1. 你的解壓縮程式有設定副檔名.jar的開啟是由解壓縮程式開啟的
      1.你可以解除解壓縮程式的關連
      2.或你可以在command指令下java -jar RndApp.jar

  4. 站長好:
    先感謝站長的回覆呢。

    關於站長所說的第一點:

    嗯~其實我也不是很懂這些,
    不確定站長所指的”解除解壓縮程式的關連”是不是如圖
    不過好像一開始就沒注意有無此設定
    所以我只好沒做任何動作了(好像也找不到副檔名.jar的勾選)

    補圖:系統自行預設開啟RndApp.jar的模式

    (本來只有Windows檔案總管..其他2個是被我亂玩錯誤也沒反應低)

    第二點呢:
    我…我我實在不懂阿ㄚㄚ….

    其實我在”開始”或”執行”輸入「command」
    →出現不相關的東西或是Windows找不到command(跳出視窗)

    然後或在”開始”及”執行”輸入「cjava -jar RndApp.jar」
    →跳出某個視窗,然後快速的自我關閉(我完全看不清楚它的畫面)

    PS.好像要玩某些東西,須先設定某種環境;
    會不會是因為我根本就沒設定相關環境的關係呢?!
    (很久之前有上類Java的一堂課,一開始老師有先設定電腦環境….故所產生的聯想)

    PS2.原諒我滴無知…汗

    1. @月牙兒,
      我先讓你可以執行
      你在開始->附屬應用程式->命令提示字元
      然後
      cd 你的RndApp.jar目錄
      然後
      java -jar RndApp.jar

  5. 站長好:

    人家依照站長的指示~

    ‧開始->附屬應用程式->命令提示字元→這一切順利押

    ‧我先輸入”cd”(按Enter)(只輸入””以內的字)
    然後再輸入”C:\Program Files Up\RndApp”(按Enter)(只輸入””以內的字)
    (因為放在這C:\Program Files Up\RndApp\RndApp.jar.zip)

    但,它就顯示「’C:\Program’ 不是內部或外部令命、可執行的程式或批次檔)」呢

    唔…若改放在C:\Program Files或C:\Program Files(x86)也是會出現上面「」內滴字耶@@”

    1. @月牙兒,
      1.建意你不要放在有空的路徑的位置
      2.或是你可以用cd “C:\Program Files Up\RndApp”
      需要加雙引號
      也可以

  6. 站長好:

    唔…照上一次站長回覆的指令2
    (輸入「”C:\Program Files Up\RndApp”」->「」內已全部輸入)
    好像依舊會出現「’C:\Program’ 不是內部或外部令命、可執行的程式或批次檔)」
    至於站長的指令1:「1.建意你不要放在有空的路徑的位置」
    我我我…我不太了解這是甚麼意思耶?

    嗯…或許人家重新開始再來一次看看”

    1.首先在C槽新增資料夾(Program Files xyz) 並放入RndApp.jar、RndApp

    由於不確定何者該解壓縮 何者不用解(以及主、副關係)
    所以放置了三個資料夾(RndApp1、RndApp2、RndApp3)
    C槽:C:\Program Files xyz\RndApp\RndApp1 (2個都是壓縮檔)
    C槽:C:\Program Files xyz\RndApp\RndApp2 (RndApp.jar解壓縮、RndApp不解壓縮)
    C槽:C:\Program Files xyz\RndApp\RndApp3 (RndApp解壓縮、RndApp.jar不解壓縮)
    附上截圖 再請至站長查看是否有錯誤呢

    圖址(ImageShack®):http://imageshack.us/a/img819/656/sc3u.jpg

    2.安裝jdk-7u15-windows-x64

    默認安裝於C槽的資料夾(Program Files)
    (與RndApp放置為不同資料夾)

    3.噗~然後好像三種(資料夾)都失敗….

    我都只點選三個資料夾內的”log4j-1.2.16″
    因為它最像應該是抽籤程式的圖示

    再請勞煩站長查看是否我有哪裡做錯誤呢?!
    因為之前有安裝一個漫畫軟體(它也需額外安裝某JAVA)
    最後有成功開始並使用(不過搞了很久就是了)
    所以覺得抽籤程式應該也是可以使用的耶

發表迴響