双核/四核 多线程随机数产生相同

ctl71801 2013-09-25 10:21:52
4线程CPU 起2个线程产生随机数的结果:

Thread-0data :1552820539
Thread-1data :1552820539

起5个线程产生的结果:(结果不一定,也许一个相同的也没有,也许就像下边这样)

Thread-0data :97343320
Thread-2data :-789287197
Thread-3data :-2114506013
Thread-1data :97343320
Thread-4data :97343320


屏蔽掉CPU的三个线程,使用单CPU起两个线程就正常了:

Thread-0data :-72870448
Thread-1data :1113782503



代码:

	private static int data = 0;

public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
data = new Random().nextInt();
System.out.println(Thread.currentThread().getName()
+ "data :" + data);
}
}).start();
}
}



问题是有没有办法既不屏蔽CPU线程,又能保证产生的随机数也不相同.
...全文
193 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ctl71801 2013-09-25
  • 打赏
  • 举报
回复
引用 7 楼 shnulaa 的回复:
我无语了,本质问题没找到。。。
好吧,你是对的 不同的种子根本没用,因为我刚同步锁没删掉,所以产生的随机数不一样,解决办法要么是换成线程的局部变量,要么在产生随机数的地方加上同步锁
晓风吹雾 2013-09-25
  • 打赏
  • 举报
回复
我无语了,本质问题没找到。。。
MiceRice 2013-09-25
  • 打赏
  • 举报
回复
另外,线程的随机数发生器,绝对不要共用!否则怎么能区分出大家有不同的随机种子?
MiceRice 2013-09-25
  • 打赏
  • 举报
回复
1、用:System.nanoTime() 再加 线程名字的hash值 2、先准备一个Random seed = Random(),然后创建线程时,都依次先用这个seed来产生一个随机数作为种子 选一个凑活着用吧。
ctl71801 2013-09-25
  • 打赏
  • 举报
回复
	private static int data = 0;
	private static int count = 0;

	public static void main(String[] args) {

		for (int i = 0; i < 2; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					synchronized (ThreadRandom.class) {
						data = new Random(System.currentTimeMillis() + count)
								.nextInt();
						System.out.println(Thread.currentThread().getName()
								+ "data :" + data);
						count ++;
					}
				}
			}).start();
		}
	}
晓风吹雾 2013-09-25
  • 打赏
  • 举报
回复
data是全局变量,你觉得data线程安全吗? Thread-1data :97343320 Thread-4data :97343320 随机数相同完全是由于data全局变量线程不安全引起的。 你把data换成局部变量试试。。
ctl71801 2013-09-25
  • 打赏
  • 举报
回复
同一时间同样的条件,怎么产生不同的种子
MiceRice 2013-09-25
  • 打赏
  • 举报
回复
你去看看Random()的构造函数源代码就立马知道为啥了。 所以new Random(seed) 时要给构造函数传递一个不重复的数作为随机种子,这个就发挥你聪明才智了。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧