Chạy chương trình dưới đây 101 lần thì nó cũng không trả về chuỗi số ngẫu nhiên. Thật không thể tin nổi, chính chúng tôi cũng không thể tin nổi, thật tuyệt vời!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package com.smartJob.demo;
import java.util.Random;
public class Random1 {
public static void main(String[] args) {
Random random = new Random(–6732303926L);
for (int i = 0; i<10; i++){
System.out.print(random.nextInt(10) + ” “);
}
}
}
//Result:
//run:
//0 1 2 3 4 5 6 7 8 9 BUILD SUCCESSFUL (total time: 0 seconds)
|
“Ngẫu nhiên mà lại không ngẫu nhiên”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package com.smartJob.demo;
import java.util.Random;
public class Random2 {
public static void main(String[] args) {
Random random = new Random(441287210);
for (int i = 0; i < 10; i++) {
System.out.print(random.nextInt(10) + ” “);
}
}
}
// Result:
//run:
//1 1 1 1 1 1 1 1 1 1 BUILD SUCCESSFUL (total time: 0 seconds)
|
Giải thích: class java.util.Random [1] sinh giá trị ngẫu nhiên dựa trên thuật toán “Trình tạo đồng dư tuyến tính” (Linear congruential generator: LCG)
1
|
n = (n * c1 + c2) % m
|
Có 4 toán hạng là: n, c1, c2, m.
Có 1 biến số là n.
Có 3 hằng số là c1, c2 và m.
Toán tử % là phép lấy đồng dư.
Giá trị n được gán giá trị mới sau mỗi vòng lặp đệ quy. Với số lượt tạo giá trị ngẫu nhiên không đủ lớn thì chưa thể tạo tính ngẫu nhiên cho chuỗi giá trị sinh ra. Để hiểu thêm về cơ chế sinh giá trị ngẫu nhiên này, bạn xem thêm cuốn sách của Donald Knuth có tên “Nghệ thuật lập trình”, tập 2, phần 3.2.1 nhé. (Donald Knuth, The Art of Computer Programming, Volume 2, Section 3.2.1.).
Thật vậy, viết một chương trình nhỏ, lần này không in ra 10 số ngẫu nhiên đầu tiên, mà in ra 100 số ngẫu nhiên đầu tiên, tính chất ngẫu nhiên xuất hiện:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package com.smartJob.demo;
import java.util.Random;
public class Explain {
public static void main(String[] args) {
Random random = new Random(441287210);
for (int i = 0; i < 100; i++) {
System.out.print(random.nextInt(10) + ” “);
}
}
}
// Result:
//run:
//1 1 1 1 1 1 1 1 1 1 3 4 7 2 2 6 0 3 0 2 8 4 1 6 0 0 0 2 8 2 9 8 9 2 5 2 1 1 4 5
//3 4 1 4 1 8 7 6 6 0 6 5 0 4 5 5 6 0 8 3 8 9 7 4 0 9 9 7 7 9 3 9 6 4 5 0 6 3 7 4
//9 8 7 6 2 8 9 8 4 4 8 4 9 0 1 6 9 6 1 5
//BUILD SUCCESSFUL (total time: 0 seconds)
|
Chương trình dưới đây, tại sao lại trả về 1?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package com.smartJob.demo;
import java.util.Random;
public class PrimitiveDataType {
public static void main(String[] args) {
int i = (byte) +(char) –(int) +(long) – 1;
System.out.println(i);
}
}
// Result:
//run:
//1
//BUILD SUCCESSFUL (total time: 0 seconds)
|
Để in ra một chuỗi “hello world”, có nhất thiết phải kỳ quặc thế này không?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
package com.smartJob.demo;
import java.util.Random;
public class HelloWorld {
public static void main(String... args) {
System.out.println(randomString(–229985452) + ‘ ‘ + randomString(–147909649));
}
public static String randomString(int seed) {
Random rand = new Random(seed);
StringBuilder sb = new StringBuilder();
for (int i = 0;; i++) {
int n = rand.nextInt(27);
if (n == 0) {
break;
}
sb.append((char) (‘`’ + n));
}
return sb.toString();
}
}
// Result:
//run:
//hello world
//BUILD SUCCESSFUL (total time: 0 seconds)
|
[1] https://docs.oracle.com/javase/8/docs/api/java/util/Random.html
Chúng tôi có làm sẵn project chứa các đoạn code trên để bạn tải về và chạy thử: Magic
Clone/fork từ repository Github: https://github.com/SmartJobVN/MagicJava
Đỗ Như Vý – developer tại SmartJob
algorithm,
chương trình java,
data type,
java,
lập trình viên java,
random,