LoginSignup
0
0

More than 5 years have passed since last update.

【Java】乱数を1億生成する

Last updated at Posted at 2015-06-25
test01.java

import java.util.Arrays;
import java.util.Random;

public class test01 {

    public static void main(String[] args) {
        long[] nums = new Random().longs(100_000_000,-200L,200L).toArray();
        System.out.println("nums[0]="+nums[0]);
        System.out.println("nums[99_999_999]="+nums[99_999_999]);
    }

}

環境

ベアボーン:Shuttle XS35GS V3
OS:win7(32bit)
JAVA SE8(jdk-8u45-windows-i586)

解説

-200から200までの乱数を1億生成して配列numsに格納して、nums[0]とnums[99_999_999]を出力する。
実行すると、「OutOfMemoryError」ってエラーが出た。
エラーを出さない対策は、-Xmxを使うと回避できるらしい。
私の環境では-Xmx1144mでエラーが出て、-Xmx1145mで正常に動いた。

JAVA SE8からrandomクラスにint,long,doubleの乱数列からなるストリームを生成するメソッドが追加された。
longsメソッドの第1引数ではストリームの要素数、第2引数と第3引数で生成する乱数の範囲を設定している。
-200Lと200LのLはlong型であることを示す。

実行結果

c:\2015>java test01
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.util.stream.Nodes$LongArrayNode.<init>(Unknown Source)
        at java.util.stream.Nodes$LongFixedNodeBuilder.<init>(Unknown Source)
        at java.util.stream.Nodes.longBuilder(Unknown Source)
        at java.util.stream.LongPipeline.makeNodeBuilder(Unknown Source)
        at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
        at java.util.stream.AbstractPipeline.evaluateToArrayNode(Unknown Source)

        at java.util.stream.LongPipeline.toArray(Unknown Source)
        at test01.main(test01.java:7)

c:\2015>java -Xmx1144m test01
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.util.stream.Nodes$LongArrayNode.<init>(Unknown Source)
        at java.util.stream.Nodes$LongFixedNodeBuilder.<init>(Unknown Source)
        at java.util.stream.Nodes.longBuilder(Unknown Source)
        at java.util.stream.LongPipeline.makeNodeBuilder(Unknown Source)
        at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
        at java.util.stream.AbstractPipeline.evaluateToArrayNode(Unknown Source)

        at java.util.stream.LongPipeline.toArray(Unknown Source)
        at test01.main(test01.java:7)

c:\2015>java -Xmx1145m test01
nums[0]=-50
nums[99_999_999]=-94

あとがき

おそらく、実行するパソコンによって-Xmx1145mでは動かないかな?あるいは、もっと少ないメモリ量でいけるか?
OutOfMemoryはJava VMの管理するメモリサイズを超えたことを意味し、「実行環境依存」ということだが、「実行環境依存」ってのがよくわからない。いまのとこはこの「実行環境依存」を掘り下げずに飛ばして勉強していこう。
このXmxの使い方が分からず半日つぶしてしまったが、エラーが出ずに実行できたときは感動ものだな。
JAVAは挫折して丸投げしたまんまだったが、今年、2015年にJAVAをある程度できるレベルにしたい。

参考文献

日経ソフトウェア 2014年10月号(日経BP社) P138~139

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0