论坛首页 Java企业应用论坛

[讨论]一般伪随机数和逼真伪随机数和真随机数

浏览 11935 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (3) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-01-14  

背景:做一个抽奖程序,当时的随机算法没考虑太深,直接调用了new Random().nextInt(totalNum);然后在测试的时候发现总共1000人左右,摇出的号很多集中在600-800之间,被人说黑幕,汗一个,查找资料,重新改随机数算法,总结如下,仅代表个人意见,欢饮大家讨论
-------------------------------------

java的Random类产生的随机数,不论是有种子还是无种子,不论是next()还是nextInt()还是...都是伪随机数,一般伪随机数,符合一定的正态分布,在某一个数字段内出现的概率会明显大于另一字段内的概率,我就很悲剧的遇上了,1000人抽选40人,600-800间的人大部分(抽了挺多次,都这样)


后来改程序,自认为实现了逼真伪随机数,就是每次都以触发时的时间毫秒数为种子,产生一个newRandom(seed),再调用nextInt(totalNum),测试发现1000人抽选40的分布比较均匀了,基本每隔100的人数都差不多。逼真是因为多了一个不确定的时间毫秒数,从而使伪随即数也有了不确定性。


至于真随机数,查找资料说是一般的计算机根本无法实现,因为一般计算机都用某种方法来创造一个随机数,这个方法肯定是确定的,所以肯定有个方法来推测出下一个随机数。(特殊计算机据说能实现) 真正的随机数要实现,只能靠人脑,比如猜猜我现在想的1000内的数是多少,我在想的这个数才是真随机数。

--------------------------------------
欢饮各抒己见
   发表时间:2011-01-14  
只使用一个种子,我这里1000个抽40个分页还是比较平均的。
如 31 : 1, 31是下标,1是被抽中的次数,这样做是为了统计,如591被抽中了两次

31 :1  |46 :1  |56 :1  |66 :1  |98 :1  |99 :1  |106:1  |184:1  |190:1  |207:1  |
225:1  |232:1  |238:1  |246:1  |258:1  |267:1  |323:1  |363:1  |382:1  |385:1  |
472:1  |489:1  |511:1  |518:1  |529:1  |560:1  |583:1  |591:2  |619:1  |633:1  |
654:1  |702:1  |796:1  |822:1  |841:1  |869:1  |937:1  |979:1  |990:1  |
0 请登录后投票
   发表时间:2011-01-14  
据说可以用噪音来实现逼真的伪随机.不过好像需要硬件支持.
0 请登录后投票
   发表时间:2011-01-14  
jorneyR 写道
只使用一个种子,我这里1000个抽40个分页还是比较平均的。
如 31 : 1, 31是下标,1是被抽中的次数,这样做是为了统计,如591被抽中了两次

31 :1  |46 :1  |56 :1  |66 :1  |98 :1  |99 :1  |106:1  |184:1  |190:1  |207:1  |
225:1  |232:1  |238:1  |246:1  |258:1  |267:1  |323:1  |363:1  |382:1  |385:1  |
472:1  |489:1  |511:1  |518:1  |529:1  |560:1  |583:1  |591:2  |619:1  |633:1  |
654:1  |702:1  |796:1  |822:1  |841:1  |869:1  |937:1  |979:1  |990:1  |



是不是我没有理解对你的意思啊,你说只使用一个种子
若是使用种子,并且一直使用这一个种子,这个随机数序列就不会变了啊,所以这种方法是不能用的。

 

public static void main(String[] args){
		Random rd = new Random(47);
		int randnum = 0;
		for(int i=0;i<40;i++){
			randnum = rd.nextInt(1000);
			System.out.println(randnum);
		}
	}
 运行这个main,每次输出都一样
0 请登录后投票
   发表时间:2011-01-14  
我是这样写的,当程序每次运行的时候,种子是不一样的,但是在同一个程序中,种子还是同一个,是我没有描述清楚。
import java.util.Random;

public class CommonUtil {
    private static Random rand = null;

    // 返回一个范围在[0, max)的随机数
    public static int nextInt(int max) {
        if (rand == null) {
            synchronized (CommonUtil.class) {
                if (rand == null) {
                    rand = new Random(System.currentTimeMillis());
                }
            }
        }

        return rand.nextInt(max);
    }
}
0 请登录后投票
   发表时间:2011-01-14  
伪随机数这样的问题可以去看看Knuth的那三本书,里面有一章专门讲随机数生成。

里面的关键问题是:什么样的数列是随机的数列呢?

原则上,任何一个有限长度的数列都不是随机的,无论你用什么办法生成。因为根据拉格朗日插值公式,给定一个有限长度的数列a1...an,一定可以找到一个多项式f(x),使得f(1)=a1,f(2)=a2,……f(n)=an,可以用多项式完整生成的数列怎么能称为随机的呢?但是如果承认这不是随机的,随机数列的生成就成为不可能!

数学家花了很长时间证明,某一类递推公式生成的数列看起来“非常像”随机的。这个“非常像”的定义比较复杂,不过Knuth那本书里说的还算好懂,想了解的话可以去仔细看看。
0 请登录后投票
   发表时间:2011-01-15  
Linux内核维护一个随机熵池。可以通过读取设备/dev/random来获得随机数。这里面获得的随机数是内核根据系统运行期间的一些随机事件确定的。比如鼠标点的位置等。随机性比较好。
0 请登录后投票
   发表时间:2011-01-15  
不知道你用的JDK是什么版本?
如果是1.4及以下的,那new Random() 默认就是用System.currentSystemMillions()作为种子。跟你后来改的程序是一样的。
如果是1.5及以上的,那new Random()默认是用System.currentSystemNanoTime() 再加上一个Random的static变量的值为种子,这个static你每new Random()一次,它的值便会自增1。
0 请登录后投票
   发表时间:2011-01-15  

package on201101;

import java.math.BigDecimal;
import java.util.Date;
import java.util.Random;

public class RandomTest {

	static final int N = 1000;
	static final int TIMES = 1000000;
	static int ary[] = new int[N];

	public static void runRandom() {
		for (int i = 0; i < N*TIMES; i++)
			ary[new Random().nextInt(N)]++;
	}

	public static void main(String[] args) {
		Date start = new Date();
		runRandom();
		System.out.println("used time is :" + (new Date().getTime() - start.getTime()) + " ms");
		printResult();
		System.out.println("------------- ");
		
		
		double d = calculateFangCha(ary);
		System.out.println("方差=" + d + ",标准差=" + Math.sqrt(d));
		
		//printPercentResult();
	}

	public static void printResult() {
		for (int i = 0; i < ary.length; i++) {
			System.out.print(ary[i] + "\t");
			if (i % 20 == 19)
				System.out.println();
		}
	}
	
	public static void printPercentResult() {
		for (int i = 0; i < ary.length; i++) {
			System.out.print(ary[i]*1.0/TIMES + "\t");
			if (i % 20 == 19)
				System.out.println();
		}
	}
	
	/**
	 * 计算方差
	 * @param nums
	 * @return
	 */
	public static double calculateFangCha(int[] nums) {
		BigDecimal total = BigDecimal.ZERO;
		BigDecimal avg = avgNum(ary);
		for (int i : nums) {
			BigDecimal temp = new BigDecimal(i).subtract(avg);
			double dtmp = Math.pow(temp.doubleValue(), 2);
			total = total.add(new BigDecimal(dtmp));
		}
		return total.divide(new BigDecimal(nums.length)).doubleValue();
	}
	
	/**
	 * 计算平均数
	 * @param nums
	 * @return
	 */
	public static BigDecimal avgNum(int[] nums) {
		long l = 0;
		for (int i : nums)
			l += i;
		return new BigDecimal(l).divide(new BigDecimal(nums.length));
	}
}

0 请登录后投票
   发表时间:2011-01-15  
used time is :1548913 ms
998903 999431 999216 996790 996874 997667 1001339 1005979 1005479 1003438 998122 998575 997964 1001837 1002150 1006779 1002309 997290 997910 998332
1002033 999481 995802 996453 998671 1005052 1009259 1005917 999764 1001700 1002111 1000367 1002949 1004952 999757 1000744 1001726 1002177 1000941 1000376
999890 1002219 998473 999082 1004460 1004426 999771 996692 999848 998952 1003985 1005948 1003483 998826 999493 997643 996496 1001789 1002516 1004990
1000491 1001941 1004033 1001460 1004748 1001378 996971 997287 1002407 1005383 1001523 1002262 1000018 999027 996595 994904 997782 996732 998424 1001541
1002707 1004556 1005949 1003990 1000742 994617 991744 995807 997425 999932 1002602 997505 1000118 1000156 1001475 998460 996104 995967 997633 1003372
1002324 1000284 1004468 1001834 996976 998252 1003058 999978 995570 992831 999058 1000635 1002911 997829 1000227 1001479 999536 1000620 1001565 999157
999506 1001215 1001833 1001210 1004529 1002300 1000480 998484 997620 1001046 1000699 1000056 1007028 1005019 1002101 1002356 1000520 999619 1002396 997368
997855 998102 996550 999422 1006230 1002933 1003372 1001748 997789 999229 996627 998141 999475 995728 995158 1005020 1012622 1006074 1003474 1000981
995171 1001313 1000503 999743 1002112 1001942 1001501 1000988 1000190 1000769 999708 994128 991922 991070 987246 994396 1002475 997307 990663 1000232
998812 1000056 1002919 998745 995393 1000717 1000920 1000246 1003532 1000821 997424 998829 1000501 1000206 1000778 999439 995018 994455 990506 996294
1003217 999434 999189 994809 992143 1000853 1002738 1002070 1002051 1001264 996721 998013 1001375 999378 995764 994032 991192 997427 999676 1003842
1012012 1005254 1000218 1000378 999868 998278 1000362 998042 995499 999151 1001741 1001566 999618 997759 994890 998114 998029 1003639 1003922 999169
999637 1001163 1000413 1000632 1002306 1000374 998072 998894 996896 997787 1002536 999428 1000607 1000794 999044 1005135 1003408 997552 998619 995537
999224 1004033 1007218 1004986 1004572 997485 996055 1000764 1003944 999251 1000800 1000865 998677 1002392 1000659 1000257 1000180 995454 994639 994297
999423 1001498 999080 1000125 1001409 1004853 1005323 1001131 999101 999686 999443 994995 996601 1000678 997765 996211 997589 992194 995085 1003189
999739 996978 997748 1002871 1001422 999500 1001065 1002850 999990 996631 998196 1003803 1001430 998441 998977 998011 998256 1000288 996650 995623
994173 997964 996300 999159 1000498 1001548 1001817 997341 997929 1001242 1000103 999404 996696 996600 998708 1000409 1001247 1002505 999909 995645
996656 997711 999622 1004828 1001687 1000112 1000117 1002378 1004481 1005966 1002887 1000415 999636 998788 999934 1002793 1004509 1000540 1001471 996828
1001418 995379 996307 999778 996875 998109 1001581 1009720 1005920 1005769 1003054 998288 1001653 1003970 1006878 1003712 1001484 998996 1003905 1005077
1001216 1003186 1003576 998092 996493 997973 1001338 1006540 1004118 999660 1001467 999663 997569 999858 999908 996095 999777 996458 999030 1005051
1004806 1000498 1001689 1002487 999146 1001399 999562 998115 1001233 1001365 998091 1002986 1005734 998179 997213 989985 997594 1002858 999700 996348
999386 1000806 999329 1001484 1001432 1001935 998555 996675 994220 998107 1001188 1004169 999896 995759 1001847 1002901 1000147 1000069 1002172 1000423
996995 999269 1000209 1003833 1004263 999244 998104 999689 1000494 1000517 1003506 1003704 1002228 1002499 1001584 1005312 1001819 999049 997114 996608
999897 1003846 1003307 1002432 1000268 1002147 1007349 1004687 1004292 1003018 998278 1000696 1007646 1007506 1005792 1001800 999714 999656 996172 1000566
1001554 1001014 999175 998768 993791 993780 1000337 1003874 1002965 1000362 996265 996911 1001995 1002582 998585 1001308 1000696 1002459 1009062 1004599
998354 999513 997991 998353 1001130 1003671 1000842 1000110 997168 997483 1006817 1003927 997256 996878 997325 999057 1005011 1004757 1000531 999725
997367 1001418 999560 997468 996638 996279 997510 1002826 1004865 1002570 998683 998570 994822 994175 999483 1000762 1000624 999053 1000800 1001992
1002844 999960 999398 1003373 996153 991752 1002120 999086 1001128 996790 989015 989746 998440 1001737 1000703 1000125 1002655 1001755 999523 999392
1003466 1003748 998134 996520 998485 997896 999186 999048 997326 999153 996205 999710 1003780 1004209 1008648 1007537 994846 996404 1003737 1000595
999892 1002664 999230 994749 1000106 1001982 1003035 999486 995635 997358 1001747 1006260 1009546 1005013 999654 998761 995082 997332 998745 1000848
997071 999540 1000479 1002779 1006365 1004755 995427 995228 997036 997205 1001806 1002205 999318 999359 992661 992537 1000025 1000512 997353 996024
995932 998294 1001205 1001276 1001035 1001147 998970 993468 1000258 1000959 997822 994623 992194 996671 999941 1002049 1002306 1001925 998881 1000170
999927 998348 1000942 1004120 998745 997486 999033 996333 1000232 1000413 996896 996865 998430 998673 998255 997951 1001531 999808 998861 1000676
997449 1000691 999554 996990 996357 998127 1001545 1001236 999664 996834 994836 994782 998876 998919 1001552 1000406 995390 1005047 1008037 1006834
1001441 996228 997650 999889 1003320 999902 998953 1003188 1000090 1000182 1000273 1000142 999891 999208 995221 998861 1002926 1001964 1002243 1002688
1002904 1000741 1000253 998553 999004 999762 1001088 1002796 1003673 1005841 1002554 996239 995632 998682 997819 999959 999193 999670 1000856 1003661
1002884 1003392 1004915 1000152 997566 996934 1000864 1005418 1002754 998409 1000974 1001818 998297 998085 993108 996061 996356 989964 993227 998732
1001481 1000092 1000362 1002017 999828 1004871 1004563 1000369 999124 995217 996564 999610 1000449 1003184 1005688 996982 989973 992781 997180 999751
1000249 991956 996067 997613 999551 998584 1000792 997219 993630 998147 1000178 1003560 1006182 1000716 998577 996159 997676 1000862 999272 998101
1007126 1003824 998518 1005784 1007276 1001353 998993 996574 998169 1002524 1005505 1006597 1004852 999495 997428 998363 1001282 1002468 999758 996806
992501 998943 1002075 1009101 1007538 1002316 1000638 1002593 1003318 1005854 1002082 997379 996105 997612 1002470 1006293 1005802 999430 1003929 998206
998726 1000373 998709 997707 999807 999432 1001237 1005446 1002349 998531 997758 995358 993350 999675 1001871 1004405 1003615 998869 998790 1005089
1004195 999756 996875 996303 995035 1002387 1005205 1008372 1003067 994906 994170 996315 996629 998858 998881 997862 998269 1004427 1005197 1000562
986791 986793 995397 997049 1000071 1002274 998465 1003023 1000581 1001218 1000943 1003061 1000897 995794 998876 995262 996100 997218 1001491 1001629
1000142 1000273 998896 1001713 1001986 999384 998149 1000712 1001772 1003609 1002706 1001208 1001018 1002174 1001760 1001717 999011 995920 996732 998489
1002131 1003088 1002439 1003187 999466 997653 998477 996414 1002309 1001327 1004624 1006314 1006427 1002867 1001786 998733 995911 996299 998958 1000196
1000905 999201 995619 1004673 992847 990673 1006609 1006636 999351 998011 999886 1001154 1006251 1007099 1002283 998734 1000315 999750 1002164 1001533
1000212 999866 998361 999143 1005048 1000117 996803 999886 996983 998281 1000629 1001062 999633 998963 998316 995983 996249 998252 1000783 1000447
995444 997555 1002133 1001159 999416 1004602 1001940 998217 995547 994407 1003017 1005439 996900 992642 995475 998751 1003481 1005644 999814 996175
996888 993989 996524 999847 996319 995891 998863 999963 1004444 1006160 1001223 995103 994321 998549 1001742 1000656 1002493 1003224 1000064 996434
-------------
方差=1.1597439802E7,标准差=3405.5014024369448
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics