1
1
#[ doc = "Random number generation" ] ;
2
2
3
- export rng;
3
+ export rng, extensions ;
4
4
5
5
enum rctx { }
6
6
@@ -15,55 +15,56 @@ native mod rustrt {
15
15
iface rng {
16
16
#[ doc = "Return the next random integer" ]
17
17
fn next( ) -> u32;
18
+ }
19
+
20
+ #[ doc = "Extension methods for random number generators" ]
21
+ impl extensions for rng {
18
22
19
- #[ doc = "Return the next random float" ]
20
- fn next_float ( ) -> float ;
23
+ #[ doc = "Return a random float" ]
24
+ fn gen_float ( ) -> float {
25
+ let u1 = self . next ( ) as float ;
26
+ let u2 = self . next ( ) as float ;
27
+ let u3 = self . next ( ) as float ;
28
+ let scale = u32:: max_value as float ;
29
+ ret ( ( u1 / scale + u2) / scale + u3) / scale;
30
+ }
21
31
22
32
#[ doc = "Return a random string composed of A-Z, a-z, 0-9." ]
23
- fn gen_str ( len : uint ) -> str ;
33
+ fn gen_str ( len : uint ) -> str {
34
+ let charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
35
+ "abcdefghijklmnopqrstuvwxyz" +
36
+ "0123456789" ;
37
+ let mut s = "" ;
38
+ let mut i = 0 u;
39
+ while ( i < len) {
40
+ let n = self . next ( ) as uint % charset. len ( ) ;
41
+ s = s + str:: from_char ( str:: char_at ( charset, n) ) ;
42
+ i += 1 u;
43
+ }
44
+ s
45
+ }
24
46
25
47
#[ doc = "Return a random byte string." ]
26
- fn gen_bytes ( len : uint ) -> [ u8 ] ;
48
+ fn gen_bytes ( len : uint ) -> [ u8 ] {
49
+ let mut v = [ ] ;
50
+ let mut i = 0 u;
51
+ while i < len {
52
+ let n = self . next ( ) as uint ;
53
+ v += [ ( n % ( u8:: max_value as uint ) ) as u8 ] ;
54
+ i += 1 u;
55
+ }
56
+ v
57
+ }
27
58
}
28
59
29
- resource rand_res( c: * rctx) { rustrt:: rand_free ( c) ; }
30
-
31
60
#[ doc = "Create a random number generator" ]
32
61
fn rng ( ) -> rng {
62
+ resource rand_res ( c: * rctx) { rustrt:: rand_free ( c) ; }
63
+
33
64
impl of rng for @rand_res {
34
65
fn next ( ) -> u32 { ret rustrt:: rand_next ( * * self ) ; }
35
- fn next_float ( ) -> float {
36
- let u1 = rustrt:: rand_next ( * * self ) as float ;
37
- let u2 = rustrt:: rand_next ( * * self ) as float ;
38
- let u3 = rustrt:: rand_next ( * * self ) as float ;
39
- let scale = u32:: max_value as float ;
40
- ret ( ( u1 / scale + u2) / scale + u3) / scale;
41
- }
42
- fn gen_str ( len : uint ) -> str {
43
- let charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
44
- "abcdefghijklmnopqrstuvwxyz" +
45
- "0123456789" ;
46
- let mut s = "" ;
47
- let mut i = 0 u;
48
- while ( i < len) {
49
- let n = rustrt:: rand_next ( * * self ) as uint %
50
- str:: len ( charset) ;
51
- s = s + str:: from_char ( str:: char_at ( charset, n) ) ;
52
- i += 1 u;
53
- }
54
- s
55
- }
56
- fn gen_bytes ( len : uint ) -> [ u8 ] {
57
- let mut v = [ ] ;
58
- let mut i = 0 u;
59
- while i < len {
60
- let n = rustrt:: rand_next ( * * self ) as uint ;
61
- v += [ ( n % ( u8:: max_value as uint ) ) as u8 ] ;
62
- i += 1 u;
63
- }
64
- v
65
- }
66
66
}
67
+
67
68
@rand_res ( rustrt:: rand_new ( ) ) as rng
68
69
}
69
70
@@ -72,7 +73,7 @@ mod tests {
72
73
73
74
#[ test]
74
75
fn test ( ) {
75
- let r1: rand :: rng = rand:: rng ( ) ;
76
+ let r1 = rand:: rng ( ) ;
76
77
log ( debug, r1. next ( ) ) ;
77
78
log ( debug, r1. next ( ) ) ;
78
79
{
@@ -95,13 +96,30 @@ mod tests {
95
96
}
96
97
97
98
#[ test]
98
- fn genstr ( ) {
99
- let r: rand:: rng = rand:: rng ( ) ;
99
+ fn gen_float ( ) {
100
+ let r = rand:: rng ( ) ;
101
+ let a = r. gen_float ( ) ;
102
+ let b = r. gen_float ( ) ;
103
+ log ( debug, ( a, b) ) ;
104
+ }
105
+
106
+ #[ test]
107
+ fn gen_str ( ) {
108
+ let r = rand:: rng ( ) ;
100
109
log ( debug, r. gen_str ( 10 u) ) ;
101
110
log ( debug, r. gen_str ( 10 u) ) ;
102
111
log ( debug, r. gen_str ( 10 u) ) ;
103
- assert ( str:: len ( r. gen_str ( 10 u) ) == 10 u) ;
104
- assert ( str:: len ( r. gen_str ( 16 u) ) == 16 u) ;
112
+ assert r. gen_str ( 0 u) . len ( ) == 0 u;
113
+ assert r. gen_str ( 10 u) . len ( ) == 10 u;
114
+ assert r. gen_str ( 16 u) . len ( ) == 16 u;
115
+ }
116
+
117
+ #[ test]
118
+ fn gen_bytes ( ) {
119
+ let r = rand:: rng ( ) ;
120
+ assert r. gen_bytes ( 0 u) . len ( ) == 0 u;
121
+ assert r. gen_bytes ( 10 u) . len ( ) == 10 u;
122
+ assert r. gen_bytes ( 16 u) . len ( ) == 16 u;
105
123
}
106
124
}
107
125
0 commit comments