c++ 随机数相关的一些函数

随机数的原理介绍,有兴趣的话不妨阅读以下:http://blog.skyoung.org/2013/08/27/generate-random-number

C语言风格的随机数生成主要是两个函数srand(), rand(). srand()设置随机数种子,rand得到[0, RAND_MAX]中的元素。下面代码是[a,b]均匀分布函数。

1 #include<cstdlib>
2 int uniform_random(int a, int b)
3 {
4      if(a == b){
5           return a;
6      }
7      return rand()%(b-a) + a;
8 }

 

这种方法简单,但是并不能很好的生成随机数。

 c++11 中用随机生成器以及分布来生成我们想要的随机数,生成器相当于rand(),分布对象则对生成的随机数进行变换,得到满足分布的随机数。

 1 #include <iostream>
 2 #include <random>
 3 int main()
 4 {
 5       std::uniform_real_distribution<> dis1(0.0,100.0);
 6       std::uniform_int_distribution<> dis2(0,100);
 7       std:: default_random_engine gen;
 8       cout<< "double = "dis1(gen()) << "\tint = " <<dis2(gen)<<endl;
 9      return 0;
10 }

 

另外可以用std::bind函数减少代码量。

google 貌似挺喜欢考随机数的题目的。

1.随机打乱一个数组,也就是实现c++库函数random_shuffle。此算法思路是每次在数组中随机选择一个元素放到数组尾部,知道数组元素全都被排好。

 1 #include <iostream>
 2 #include <random>
 3 template <class RandomAccessIterator>
 4 void random_shuffle(RandomAccessIterator first, RandomAccessIterator last)
 5 {
 6   auto n = (last-first);
 7   std::default_random_engine gen;
 8   for(auto i = n-1; i > 0; --i){
 9     std::uniform_int_distribution<> rand(1, i);
10     std::swap(first[rand(gen)], first[i]);
11   }
12 }
13 int main()
14 {
15   int array[] = {1,2,3,4,5,6,7};
16   random_shuffle(std::begin(array), std::end(array));
17   for(auto e : array){
18     std::cout<<e <<"\t";
19   }
20   return 0;
21 }

 

secret santa 是有n个人圣诞节大家互相送礼物,使得每个人随机收到礼物并且礼物不能来自自身。我们可以每次对这些礼物进行random_shuffle如果有人收到本身做礼物的话则重新random_shuffle

#include <iostream>
#include <random>
#include <vector>
void secret_santa(std::vector<int>& gifts)
{
    random_shuffle(begin(gifts), end(gifts));
    for(int i = 0; i < gifts.size(); ++i){
        if(gifts[i] == i+1){
            secret_santa(gifts);
            return;
        }
    }
}

 

posted @ 2015-12-18 03:19  Jaunty_  阅读(356)  评论(0编辑  收藏  举报