JavaScript 已经自带了随机数生成函数,为什么我们还需要弄一个随机数的生成工具呢?
例如 Web 的考试系统里,加载试卷后,需要把试卷的题目顺序打乱,如果用 JS 的随机数函数的话,每次打乱的顺序都是不一样的,因为每次生成的随机数序列都不一样。问题出现了,同一个学员刷新试卷后,题目的顺序和上一次的竟然不一样,这不符合实际要求,应该是不同学员的题目顺序不一样,但是同一个学员的题目顺序永远是一样的。这样就不能使用直接使用原生的随机函数了,下面定义一个随机数生成函数,随机数种子是一个字符串,这样就可以用学员的编码来作为随机数种子生成随机数打乱题目的顺序了,因为每次刷新时同一个学员的编码都是一样的,所以生成的随机数序列都相同,就保证了同一个学员的试卷题目顺序一直都是一样的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 <!DOCTYPE html > <html > <head > <meta charset ="utf-8" > <title > </title > </head > <body > <script type ="text/javascript" > function Random (seed ) { this .seed = this .hashCode(seed + '' ); } Random.prototype.hashCode = function (str ) { var hash = 0 ; if (str.length == 0 ) return hash; for (i = 0 ; i < str.length; i++) { char = str.charCodeAt(i); hash = hash * 31 + char; hash = hash & hash; } return hash; } Random.prototype.nextInt = function ( ) { this .seed = (this .seed * 9301 + 49297 ) % 233280 ; var t = this .seed / 233280.0 ; return Math .abs(Math .ceil(t * 10000000 )); } var random = new Random(103 ); for (var i = 0 ; i < 100 ; ++i) { console .log(i + ': ' + random.nextInt() % 80 ); } var max = 10 ; var frequence = {}; for (var i = 0 ; i < max; ++i) { frequence['' + i] = 0 ; } for (var i = 0 ; i < 10000 ; ++i) { var r = random.nextInt() % max; frequence['' + r] = frequence['' + r] + 1 ; } console .log(frequence); </script > </body > </html >