随机数的原理介绍,有兴趣的话不妨阅读以下: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; } } }
原文:http://www.cnblogs.com/Jaunty/p/5053512.html