您的位置:首页 > 其它

关于随机数的一点小结

2014-04-13 22:28 239 查看
关于随机数在前面的扫雷程序中用到过,下面是扫雷程序中的一段代码:

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
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: