当前位置:网站首页>Things like random
Things like random
2022-07-07 00:01:00 【Bulst】
Last article , We explained several ways to generate random numbers .
Next , Let's take a closer look Random How is it realized .
Before the start , Let's make a small demo
public static void main(String[] args) {
Random random = new Random();
for (int i = 0; i < 10; i++) {
int randomValue = random.nextInt(10);
System.out.println(randomValue);
}
}
This procedure , How many times do you run , It generates different numbers .
And you add a seed to it , It generates the same sequence .
such as
public static void main(String[] args) {
Random random = new Random(1);
for (int i = 0; i < 10; i++) {
int randomValue = random.nextInt(10);
System.out.println(randomValue);
}
}
Why is that ?
You must have read the previous article , It's already clear .
because Random Default constructor , Use time as seed , So the values generated each time are different .
/** * Creates a new random number generator. This constructor sets * the seed of the random number generator to a value very likely * to be distinct from any other invocation of this constructor. */
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}
Let's take a look at how to generate random numbers .
// bound: The range of random numbers
public int nextInt(int bound) {
if (bound <= 0)
throw new IllegalArgumentException(BadBound);
// track 【 Make new seeds from old ones 】
int r = next(31);
// Calculate the random number according to the new seed
int m = bound - 1;
if ((bound & m) == 0) // i.e., bound is a power of 2
r = (int)((bound * (long)r) >> 31);
else {
for (int u = r;
u - (r = u % bound) + m < 0;
u = next(31))
;
}
In the case of a single thread, each call nextInt New seeds are calculated from old seeds , This can guarantee the randomness of random numbers .
But in multithreading, multiple threads may take the same old seed to calculate the new seed , This will cause multiple threads to produce the same new seeds , Because the algorithm of generating random numbers is fixed , Therefore, it will cause multiple threads to produce the same random value .
therefore int r = next(31); To be atomic , That is, when multiple threads calculate a new seed based on the same old seed , After the new seed of the first thread is calculated , The second thread discards its old seeds , Use the new seed of the first thread to calculate your new seed , By analogy , Only this is guaranteed , To ensure that the random number generated by multithreading is random .
track 【 Make new seeds from old ones 】
protected int next(int bits) {
long oldseed, nextseed;
// Atomic classes
AtomicLong seed = this.seed;
do {
oldseed = seed.get();
nextseed = (oldseed * multiplier + addend) & mask;
} while (!seed.compareAndSet(oldseed, nextseed));
return (int)(nextseed >>> (48 - bits));
}
ah , this …
Typical CAS Well .
Forget it , Eating out , Wait for the next one , Let's have a good talk CAS.
边栏推荐
- Building lease management system based on SSM framework
- 自动化测试工具Katalon(Web)测试操作说明
- How to use vector_ How to use vector pointer
- The programmer refused the offer because of low salary, HR became angry and netizens exploded
- 陀螺仪的工作原理
- [vector retrieval research series] product introduction
- (leetcode) sum of two numbers
- DAY TWO
- iMeta | 华南农大陈程杰/夏瑞等发布TBtools构造Circos图的简单方法
- MATLIB reads data from excel table and draws function image
猜你喜欢
随机推荐
Google, Baidu and Yahoo are general search engines developed by Chinese companies_ Baidu search engine URL
C语言输入/输出流和文件操作【二】
MIT 6.824 - raft Student Guide
"Latex" Introduction to latex mathematical formula "suggestions collection"
Oracle中使用包FY_Recover_Data.pck来恢复truncate误操作的表
Use package FY in Oracle_ Recover_ Data. PCK to recover the table of truncate misoperation
leetcode:236. The nearest common ancestor of binary tree
DAY ONE
[vector retrieval research series] product introduction
[OFDM communication] OFDM system signal detection based on deep learning with matlab code
GPIO简介
DAY FOUR
什么是响应式对象?响应式对象的创建过程?
Huawei mate8 battery price_ Huawei mate8 charges very slowly after replacing the battery
Please help xampp to do sqlilab is a black
App general function test cases
在Docker中分分钟拥有Oracle EMCC 13.5环境
MATLIB从excel表中读取数据并画出函数图像
Pytest multi process / multi thread execution test case
Building lease management system based on SSM framework








