(1) Math.random() v.s. Random

About

Java์—์„œ ๋‚œ์ˆ˜๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ๋ณด์ž. ์ œ์ผ ์‰ฌ์šด ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

  1. java.lang.Math์˜ static ๋ฉ”์†Œ๋“œ random()

  2. java.util.Random ํด๋ž˜์Šค

์—ฌ๊ธฐ์„œ ๋ฐœ์ƒ๋˜๋Š” ๋‚œ์ˆ˜๋ฅผ ์˜์‚ฌ๋‚œ์ˆ˜(Pseudorandom Number)๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ๋‚œ์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋‚œ์ˆ˜๋กœ ์ทจ๊ธ‰์ด ๊ฐ€๋Šฅํ•œ ์ˆ˜์—ด์„ ์ง€์นญํ•œ๋‹ค.

java.lang.Math.random()

Math๋Š” java.lang ํŒจํ‚ค์ง€์— ์†ํ•ด ์žˆ์–ด ๋ณ„๋„๋กœ importํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

Math.random()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ˜„์žฌ ์‹œ๊ฐ„์„ seed๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

MathRandomTest.java
public class MathRandomTest {
    public static void main(String[] args) {
        double rand = Math.random();
        System.out.println(rand); // 0.4537741466030336
    }
}

์ •์ˆ˜ ๋งŒ๋“ค๊ธฐ

์ •์ˆ˜ ํƒ€์ž…์˜ ๋‚œ์ˆ˜๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋„ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 0 ์ด์ƒ 9 ์ดํ•˜์˜ ๋‚œ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด 10์„ ๊ณฑํ•ด์ฃผ๊ณ  int ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.

MathRandomIntegerTest.java
public class MathRandomIntegerTest {
    public static void main(String[] args) {
        int rand = (int) (Math.random() * 10);
        System.out.println(rand); // 0.4537741466030336
    }
}

java.util.Random ํด๋ž˜์Šค

Random ํด๋ž˜์Šค๋Š” java.util ํŒจํ‚ค์ง€์— ์†ํ•ด์žˆ์œผ๋ฏ€๋กœ importํ•ด์•ผํ•œ๋‹ค.

UtilRandomTest.java
import java.util.Random;

public class UtilRandomTest {
    public static void main(String[] args) {
        // 1. Random ๊ฐ์ฒด ์ƒ์„ฑ
        Random rand = new Random();
        
        // 2. Random ๊ฐ์ฒด ์ƒ์„ฑ (์ƒ์„ฑ์ž๋กœ seed ์ „๋‹ฌ)
        long seed = System.currentTimeMillis();
        Random rand2 = new Random(seed);
        
        // 3. Random ๊ฐ์ฒด ์ƒ์„ฑ (setSeet() ๋ฉ”์†Œ๋“œ๋กœ seed ์ „๋‹ฌ)
        Random rand3 = new Random();
        rand3.setSeed(System.currentTimeMillis());
        
        int intRand = rand.nextInt(10); // 7
    }
}
  • Math.random()๊ณผ ๋‹ฌ๋ฆฌ ๋จผ์ € Random ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

  • seed๋ฅผ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ƒ์„ฑ์ž์— seed๋ฅผ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜, setSeed() ๋ฉ”์†Œ๋“œ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋‹ค์–‘ํ•œ ๋‚œ์ˆ˜ ๋ฐœ์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค.

    • nextBoolean(), nextInt(), nextLong(), nextInt(int n), nextFloat(), nextDouble(), nextGaussian()

๊ทธ๋Ÿผ ๋ญ˜ ์จ์•ผ๋ ๊นŒ?

Stack Overflow์˜ ํ•œ ๊ธ€์— ๋”ฐ๋ฅด๋ฉด Random.nextInt(n)๊ฐ€ Math.random() * n๋ณด๋‹ค ๋” ํšจ์œจ์ ์ด๊ณ  ๋œ ํŽธํ–ฅ์ (biased)์ด๋ผ๊ณ  ํ•œ๋‹ค.

Math.random()์€ ๋‚ด๋ถ€์ ์œผ๋กœ Random.nextDouble()์„ ์‚ฌ์šฉํ•œ๋‹ค. Random.nextDouble()์€ Random.next() ํ•จ์ˆ˜๋ฅผ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•ด์„œ ๊ฐ€์ˆ˜๋ถ€(mantissa)์— ๊ท ์ผํ•˜๊ฒŒ ๋ถ„ํฌ๋œ ๋น„ํŠธ๋ฅผ ๊ฐ–๋Š” double์„ ์ƒ์„ฑํ•˜๋ฏ€๋กœ 0๋ถ€ํ„ฐ 1 - 2^(-53) ๋ฒ”์œ„์—์„œ ๋” ๊ท ์ผํ•˜๊ฒŒ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค๊ณ  ํ•œ๋‹ค.

Random.nextInt(n)์€ Random.next()๋ฅผ ํ‰๊ท  2๋ฒˆ ๋ฏธ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค. ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•˜๊ณ , ๋งŒ์•ฝ ๊ฐ’์ด MAX_INT๋ณด๋‹ค ์ž‘์€ ๊ฐ€์žฅ ํฐ n์˜ ๋ฐฐ์ˆ˜๋ณด๋‹ค ํฌ๋‹ค๋ฉด ๋‹ค์‹œ ์‹œ๋„ํ•˜๊ณ , ์•„๋‹ˆ๋ผ๋ฉด ๊ฐ’ mod n์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ MAX_INT๋ณด๋‹ค ์ž‘์€ ๊ฐ€์žฅ ํฐ n์˜ ๋ฐฐ์ˆ˜๋ณด๋‹ค ํฐ ๊ฐ’๋“ค์ด ๋‚˜์˜ค์ง€ ์•Š๋„๋ก ํ•˜์—ฌ, ๊ฐ’์˜ ํŽธํ–ฅ์„ฑ์„ ์ค„์ธ๋‹ค) ๊ทธ๋ž˜์„œ 0๋ถ€ํ„ฐ n-1์˜ ๋ฒ”์œ„์—์„œ ๊ท ์ผํ•˜๊ฒŒ ๋ถ„ํฌ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

...

Math.random()์€ ์•ฝ ๋‘ ๋ฐฐ์˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค.

More on the matter

REF

Last updated

Was this helpful?