@@ -588,64 +588,35 @@ pub trait Rng: RngCore {
588588
589589 /// Return a random element from `values`.
590590 ///
591- /// Return `None` if `values` is empty.
592- ///
593- /// # Example
594- ///
595- /// ```
596- /// use rand::{thread_rng, Rng};
597- ///
598- /// let choices = [1, 2, 4, 8, 16, 32];
599- /// let mut rng = thread_rng();
600- /// println!("{:?}", rng.choose(&choices));
601- /// assert_eq!(rng.choose(&choices[..0]), None);
602- /// ```
591+ /// Deprecated: use [`SliceRandom::choose`] instead.
592+ ///
593+ /// [`SliceRandom::choose`]: seq/trait.SliceRandom.html#method.choose
594+ #[ deprecated( since="0.6.0" , note="use SliceRandom::choose instead" ) ]
603595 fn choose < ' a , T > ( & mut self , values : & ' a [ T ] ) -> Option < & ' a T > {
604- if values. is_empty ( ) {
605- None
606- } else {
607- Some ( & values[ self . gen_range ( 0 , values. len ( ) ) ] )
608- }
596+ use seq:: SliceRandom ;
597+ values. choose ( self )
609598 }
610599
611600 /// Return a mutable pointer to a random element from `values`.
612601 ///
613- /// Return `None` if `values` is empty.
602+ /// Deprecated: use [`SliceRandom::choose_mut`] instead.
603+ ///
604+ /// [`SliceRandom::choose_mut`]: seq/trait.SliceRandom.html#method.choose_mut
605+ #[ deprecated( since="0.6.0" , note="use SliceRandom::choose_mut instead" ) ]
614606 fn choose_mut < ' a , T > ( & mut self , values : & ' a mut [ T ] ) -> Option < & ' a mut T > {
615- if values. is_empty ( ) {
616- None
617- } else {
618- let len = values. len ( ) ;
619- Some ( & mut values[ self . gen_range ( 0 , len) ] )
620- }
607+ use seq:: SliceRandom ;
608+ values. choose_mut ( self )
621609 }
622610
623611 /// Shuffle a mutable slice in place.
624612 ///
625- /// This applies Durstenfeld's algorithm for the [Fisher–Yates shuffle](
626- /// https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_modern_algorithm)
627- /// which produces an unbiased permutation.
628- ///
629- /// # Example
630- ///
631- /// ```
632- /// use rand::{thread_rng, Rng};
633- ///
634- /// let mut rng = thread_rng();
635- /// let mut y = [1, 2, 3];
636- /// rng.shuffle(&mut y);
637- /// println!("{:?}", y);
638- /// rng.shuffle(&mut y);
639- /// println!("{:?}", y);
640- /// ```
613+ /// Deprecated: use [`SliceRandom::shuffle`] instead.
614+ ///
615+ /// [`SliceRandom::shuffle`]: seq/trait.SliceRandom.html#method.shuffle
616+ #[ deprecated( since="0.6.0" , note="use SliceRandom::shuffle instead" ) ]
641617 fn shuffle < T > ( & mut self , values : & mut [ T ] ) {
642- let mut i = values. len ( ) ;
643- while i >= 2 {
644- // invariant: elements with index >= i have been locked in place.
645- i -= 1 ;
646- // lock element i in place.
647- values. swap ( i, self . gen_range ( 0 , i + 1 ) ) ;
648- }
618+ use seq:: SliceRandom ;
619+ values. shuffle ( self )
649620 }
650621}
651622
@@ -999,46 +970,13 @@ mod test {
999970 }
1000971 }
1001972
1002- #[ test]
1003- fn test_choose ( ) {
1004- let mut r = rng ( 107 ) ;
1005- assert_eq ! ( r. choose( & [ 1 , 1 , 1 ] ) . map( |& x|x) , Some ( 1 ) ) ;
1006-
1007- let v: & [ isize ] = & [ ] ;
1008- assert_eq ! ( r. choose( v) , None ) ;
1009- }
1010-
1011- #[ test]
1012- fn test_shuffle ( ) {
1013- let mut r = rng ( 108 ) ;
1014- let empty: & mut [ isize ] = & mut [ ] ;
1015- r. shuffle ( empty) ;
1016- let mut one = [ 1 ] ;
1017- r. shuffle ( & mut one) ;
1018- let b: & [ _ ] = & [ 1 ] ;
1019- assert_eq ! ( one, b) ;
1020-
1021- let mut two = [ 1 , 2 ] ;
1022- r. shuffle ( & mut two) ;
1023- assert ! ( two == [ 1 , 2 ] || two == [ 2 , 1 ] ) ;
1024-
1025- let mut x = [ 1 , 1 , 1 ] ;
1026- r. shuffle ( & mut x) ;
1027- let b: & [ _ ] = & [ 1 , 1 , 1 ] ;
1028- assert_eq ! ( x, b) ;
1029- }
1030-
1031973 #[ test]
1032974 fn test_rng_trait_object ( ) {
1033975 use distributions:: { Distribution , Standard } ;
1034976 let mut rng = rng ( 109 ) ;
1035977 let mut r = & mut rng as & mut RngCore ;
1036978 r. next_u32 ( ) ;
1037979 r. gen :: < i32 > ( ) ;
1038- let mut v = [ 1 , 1 , 1 ] ;
1039- r. shuffle ( & mut v) ;
1040- let b: & [ _ ] = & [ 1 , 1 , 1 ] ;
1041- assert_eq ! ( v, b) ;
1042980 assert_eq ! ( r. gen_range( 0 , 1 ) , 0 ) ;
1043981 let _c: u8 = Standard . sample ( & mut r) ;
1044982 }
@@ -1051,10 +989,6 @@ mod test {
1051989 let mut r = Box :: new ( rng) as Box < RngCore > ;
1052990 r. next_u32 ( ) ;
1053991 r. gen :: < i32 > ( ) ;
1054- let mut v = [ 1 , 1 , 1 ] ;
1055- r. shuffle ( & mut v) ;
1056- let b: & [ _ ] = & [ 1 , 1 , 1 ] ;
1057- assert_eq ! ( v, b) ;
1058992 assert_eq ! ( r. gen_range( 0 , 1 ) , 0 ) ;
1059993 let _c: u8 = Standard . sample ( & mut r) ;
1060994 }
0 commit comments