当前位置:网站首页>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.
边栏推荐
- 快手的新生意,还得靠辛巴吆喝?
- 三句话简要介绍子网掩码
- DevOps可以帮助减少技术债务的十种方式
- MySQL master-slave multi-source replication (3 master and 1 slave) setup and synchronization test
- 亚朵三顾 IPO
- MIT 6.824 - raft Student Guide
- 基于jsp+servlet+mysql框架的旅游管理系统【源码+数据库+报告】
- How about the order management of okcc call center
- Compile logisim
- How does win11 restore the traditional right-click menu? Win11 right click to change back to traditional mode
猜你喜欢

MVC and MVVM

The "white paper on the panorama of the digital economy" has been released with great emphasis on the digitalization of insurance

What is a responsive object? How to create a responsive object?
![[OFDM communication] OFDM system signal detection based on deep learning with matlab code](/img/a5/624860f6bd9be03ac8c1f61839fea2.png)
[OFDM communication] OFDM system signal detection based on deep learning with matlab code

基于jsp+servlet+mysql框架的旅游管理系统【源码+数据库+报告】

DAY ONE

GEO数据挖掘(三)使用DAVID数据库进行GO、KEGG富集分析

STM32 enters and wakes up the stop mode through the serial port

DAY FIVE

After 3 years of testing bytecan software, I was ruthlessly dismissed in February, trying to wake up my brother who was paddling
随机推荐
Hydrogen future industry accelerates | the registration channel of 2022 hydrogen energy specialty special new entrepreneurship competition is opened!
MySQL master-slave multi-source replication (3 master and 1 slave) setup and synchronization test
leetcode:236. The nearest common ancestor of binary tree
GPIO简介
刘永鑫报告|微生物组数据分析与科学传播(晚7点半)
SuperSocket 1.6 创建一个简易的报文长度在头部的Socket服务器
The intranet penetrates the zerotier extranet (mobile phone, computer, etc.) to access intranet devices (raspberry pie, NAS, computer, etc.)
Introduction au GPIO
How about the order management of okcc call center
陀螺仪的工作原理
【212】php发送post请求有哪三种方法
达晨史上最大单笔投资,今天IPO了
快讯 l Huobi Ventures与Genesis公链深入接洽中
Pdf document signature Guide
openresty ngx_ Lua subrequest
Why is bat still addicted to 996 when the four-day working system is being tried out in Britain?
DAY TWO
1000字精选 —— 接口测试基础
英国都在试行4天工作制了,为什么BAT还对996上瘾?
17、 MySQL - high availability + read / write separation + gtid + semi synchronous master-slave replication cluster