关于随机数在前面的扫雷程序中用到过,下面是扫雷程序中的一段代码:
srand((unsigned)time(0));
//设置m_iMineNum个雷
do
{
//以当前秒数为产生随机算法
int k=(rand())%m_RowCount;
int l=(rand())%m_ColCount;
//为了避免一个位置同时算两个雷
//只允许当前位置不是雷时赋值为雷
if(m_Mine[k][l].iArondMineNum != -1)
{
//这个位置有雷
m_Mine[k][l].iArondMineNum = -1;
aa++;
}
}while(aa!=m_iMineNum);
避免同一个等级布雷出现相同的情况。在网上看到了一些关于随机数的几个算法,在这里做一个小结,后续再接着完善。
// Rand.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <time.h> #include <stdlib.h> #include <algorithm> #include <set> using namespace std; inline void exchange(int *arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } //一般的rand()产生2^15次方的数量级 //产生一个较大的随机数(到2^30数量级) int bigrand() { return (RAND_MAX)*rand()+rand(); } //产生一个在区间[l, h]之间的随机数 int randint(int l, int h) { return l+bigrand()%(h-l+1); } //产生m个在[0,n-1]之间的有序的随机数 //Knuth法: //时间O(n), 空间O(1) void randsortedint_knuth(int m, int n) { for (int i = 0; i < n; i++) { if(bigrand() % (n-i) < m) { cout << i << "/n"; m--; } } } //产生m个在[0, n-1]之间的有序的随机数 //弄乱数组法: //时间O(m*logm), 空间O(n) void randsortedint_shuffer(int m, int n) { int *arr = new int[n]; for(int i = 0; i < n; ++i) arr[i] = i; for(int i = 0; i < m; ++i) exchange(arr, i, randint(i, n-1)); sort(arr, arr+m); for(int i = 0; i < m; ++i) cout << arr[i] << endl; } //产生m个在[0,n-1]之间的有序的随机数 //floyd法: //时间:O(m*logm), 空间O(m) void randsortedint_floyd(int m, int n) { //容器 set<int> s; for(int i = n-m; i < n; i++) { int t = bigrand()%(i+1); if(s.find(t) == s.end()) s.insert(t); else s.insert(i); } for(set<int>::iterator i = s.begin(); i != s.end(); ++i) cout << *i << endl; } int _tmain(int argc, _TCHAR* argv[]) { int i=srand(unsigned(time(NULL))); system("pause"); return 0; }