当前位置:网站首页>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.
边栏推荐
- Supersocket 1.6 creates a simple socket server with message length in the header
- openresty ngx_ Lua subrequest
- Use Yum or up2date to install the postgresql13.3 database
- Wasserstein slim gain with gradient poverty (wsgain-gp) introduction and code implementation -- missing data filling based on generated countermeasure network
- 基于jsp+servlet+mysql框架的旅游管理系统【源码+数据库+报告】
- How about the order management of okcc call center
- Compile logisim
- DAY SIX
- Local deployment Zeppelin 0.10.1
- (LeetCode)两数之和
猜你喜欢

Basic chart interpretation of "Oriental selection" hot out of circle data

Interface joint debugging test script optimization v4.0

The programmer refused the offer because of low salary, HR became angry and netizens exploded

How to find out if the U disk file of the computer reinstallation system is hidden

iMeta | 华南农大陈程杰/夏瑞等发布TBtools构造Circos图的简单方法

Competition between public and private chains in data privacy and throughput
![[boutique] Pinia Persistence Based on the plug-in Pinia plugin persist](/img/53/95ab85bfd99d943f98881596d0aa8c.png)
[boutique] Pinia Persistence Based on the plug-in Pinia plugin persist

量子时代计算机怎么保证数据安全?美国公布四项备选加密算法

Cas d'essai fonctionnel universel de l'application

从外企离开,我才知道什么叫尊重跟合规…
随机推荐
DevOps可以帮助减少技术债务的十种方式
达晨史上最大单笔投资,今天IPO了
matplotlib画柱状图并添加数值到图中
Cas d'essai fonctionnel universel de l'application
After 3 years of testing bytecan software, I was ruthlessly dismissed in February, trying to wake up my brother who was paddling
Design of short chain
Compile logisim
Why is bat still addicted to 996 when the four-day working system is being tried out in Britain?
DAY TWO
MySQL主从之多源复制(3主1从)搭建及同步测试
DAY ONE
leetcode:236. The nearest common ancestor of binary tree
1000 words selected - interface test basis
[CVPR 2022] target detection sota:dino: Detr with improved detecting anchor boxes for end to end object detection
DAY TWO
MIT 6.824 - raft Student Guide
基于SSM框架实现的房屋租赁管理系统
Common modification commands of Oracle for tables
Oracle中使用包FY_Recover_Data.pck来恢复truncate误操作的表
(LeetCode)两数之和