0

我有这个 ArrayList 的数据填充了我打开的文件中的数字,我希望能够通过输入样本的大小和我想要的样本数来从中生成随机数。所以我有以下...

private JTextField jtfN = new JTextField();// where i enter the amount of samples
private JTextField jtfn = new JTextField();// where i enter the size of samples
private ArrayList< Double> data = new ArrayList< Double>();

我有两个文本字段,一个名为 jtfn(样本大小)和一个 jtfN(样本数量),我在其中输入值。然后,我有一个名为 jbtnGenerate 的按钮,当我单击时,我希望它从上面输入的 jtfn 和 jtfN 的数据中生成随机数,然后将其放入名为 jta 的 TextArea

那是我打开文件并将数字添加到数据中的地方

if( jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION ) {

String file = jfc.getSelectedFile().getPath();
String line = null;
String[] ch;

try {   
    FileReader fr = new FileReader( file);
    BufferedReader br = new BufferedReader(fr);
    data.clear();
    while( (ligne=br.readLine())!=null ) {
        ch = line.split( ";" );
        for (int i = 0; i < ch.length; i++) {
            data.add( Double.parseDouble(ch[i]) );  
        }                       
    }

    br.close();             
}
catch( IOException ioe ) {
}           

}

那是我希望在其中发生操作的按钮“生成”的侦听器。

       jbtnGenerer.addActionListener( new ActionListener() {
        public void actionPerformed( ActionEvent ae ) {

            try {                   

             int sampSize = Integer.parseInt(jtfn.getText());
             int nSamples = Integer.parseInt(jtfN.getText());

            double samps[][] = new double[nSamples][sampSize];

            for(int i = 0 ; i < nSamples; i++){
                for(int j = 0 ; j < sampSize; j++)
                    samps[i][j] = (Double) data.toArray()[ rng.nextInt() % data.size() ];
              }


                jta.append(samps.toString());

            } catch (NumberFormatException e) {

            }
        }

    });

谢谢您的帮助

4

1 回答 1

0

代码中没有真正的随机数,但有伪随机数生成器。为了生成整数和创建样本组,您需要创建一个 Random 对象。您必须先导入它:

    import java.util.Random;

然后,您必须创建它并在您的函数中为其提供种子。最常用的种子是以毫秒为单位的当前时间:

    Random rng = new Random( System.currentTimeMillis() );

我的猜测是你想先解析输入,所以像

    int sampSize;
    int nSamples;
    if( !jtfn.getText().isEmpty() )
     sampSize = Integer.parseInt(jtfn.getText());
    if( !jtfN.getText().isEmpty() )
     nSamples = Integer.parseInt(jtfN.getText());

然后你必须做一些东西来保存你的样品。二维数组可以正常工作。

    double samps[][] = new double[nSamples][sampSize];

从那里,您需要填充您的样本组数组。单个循环可以正常工作,但为了便于阅读,这里有一个嵌套的 for 循环:

    for(int i = 0 ; i < nSamples; i++){
      for(int j = 0 ; j < sampSize; j++)
        samps[i][j] = data.get( rng.nextInt(data.size()) );
    }

其中 rand() 是您的语言将使用的 RNG 函数。从那里,您将拥有一个 N xn 大小的数组,其中填充了样本。

于 2013-11-05T01:12:39.027 回答