Advertisement
Guest User

Untitled

a guest
Mar 20th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.68 KB | None | 0 0
  1. extern crate rand;
  2.  
  3. use rand::Rng;
  4.  
  5. type Lotto = [i8;7];
  6.  
  7.  
  8. fn create_lotto<R: Rng> (rng: &mut R) -> Lotto
  9. {
  10.     let mut res = [0;7];
  11.     for i in 0..7 {
  12.         loop {
  13.             let val = rng.gen_range(1 as i8, 45 as i8);
  14.             if !res[0..i].contains(&val) {
  15.                 res[i] = val;
  16.                 break;
  17.             }
  18.         }
  19.     }
  20.     res.sort();
  21.     res
  22. }
  23.  
  24. fn dup_n_range_k(n: i8, k: i8) -> Box<Fn(Lotto, Lotto) -> bool>
  25. {
  26.     Box::new(move |prev, next| {
  27.         let mut same = 0;
  28.         let mut range = 0;
  29.         for &value in next.iter() {
  30.             if prev.contains(&value) {
  31.                 same += 1;
  32.             }
  33.             if prev.iter()
  34.                 .any(|&x| x != value && x >= (value-k) && x <= (value+k))
  35.             {
  36.                 range += 1;
  37.             }
  38.         }
  39.         n == same && range == k
  40.     })
  41. }
  42.  
  43. fn try<R: Rng> (rng: &mut R, f: Box<Fn(Lotto, Lotto)->bool>, n: i32)
  44.      -> usize
  45. {
  46.     let mut count = 0;
  47.     let mut prev = create_lotto(rng);
  48.     for _ in 0..n {
  49.         let new = create_lotto(rng);
  50.         if f(prev, new) {
  51.             count += 1;
  52.         }
  53.         prev = new;
  54.     }
  55.     return count;
  56. }
  57.  
  58. fn main() {
  59.     let mut rng = rand::thread_rng();
  60.     let mut accum = Vec::new();
  61.     let n = 10000;
  62.     for _ in 0..n {
  63.         let count = try(&mut rng, dup_n_range_k(5, 1), 744) ;
  64.         if accum.len() <= count {
  65.             accum.resize(count +1, 0);
  66.         }
  67.         accum[count] += 1;
  68.     }
  69.     println!("숫자 5개가 직전회차에 그대로 발견되고, 나머지 두 숫자는 직전회차 숫자와 +-1 이내일 확률: {:.3}%", (accum[1] as f64)/(n as f64) * 100.0);
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement