32位随机数

简介: 32位随机数

声明

class DLL_SN_EXT_CLASS CRand32
{
public:
CRand32();
unsigned int rand();
bool Prize(double dOdds);//中奖几率,dOdds<=0,必定不中;dOdds>=1 必中
protected:
unsigned int m_iSeed; /* Seed variables */
static int s_iObjNum;
};


优点:


一,不需要随机种子,多个对象会随机不同的种子。 


二,范围和UINT的范围同


实现


int CRand32::s_iObjNum = 0;
CRand32::CRand32()
{
m_iSeed = ::time(NULL) + s_iObjNum++;
}
unsigned int CRand32::rand()
{
m_iSeed = 214013 * m_iSeed + 2531011;
return m_iSeed;
}
bool CRand32::Prize(double dOdds)//中奖几率,dOdds<=0,必定不中;dOdds>=1 必中
{
return (double)rand() / UINT_MAX < dOdds;
}


测试样例


TEST_METHOD(RAND32_1)
{// n 个对象的第一个随机数,一定不相同
const int n = 100;
SN::CRand32 rs[n];
int iRs[n] = { 0 };
{
for (int i = 0; i < n; i++)
{
iRs[i] = rs[i].rand();
}
}
{
for( int i = 0 ; i < n ; i++ )
for (int j = i + 1; j < n; j++)
{
Assert::AreNotEqual(iRs[i], iRs[j]);
}
}
}
TEST_METHOD(RAND32_2)
{//随机次数足够多,每位为0,1的几率稳定(正负10%)
SN::CRand32 rand ;
int a[32] = { 0 };
const int iNum = 10000000;
for (int i = 0; i < iNum; i++)
{
unsigned int r = rand.rand();
for (int j = 0; j < 32; j++)
{
a[j] += ((r >> j) & 0x1);
}
}
{
for (int i = 0; i < 32; i++)
{
CString s;
s.Format(_T("%d"), i);
Assert::IsTrue(abs(a[i] - iNum / 2) < iNum / 20,s);
}
}
}
TEST_METHOD(RAND32_3)
{
SN::CRand32 r;
const int iNum = 10000000;
int a[5] = { 0 };
for (int i = 0; i < iNum; i++)
{
a[0] += r.Prize(0);
a[1] += r.Prize(0.0001);
a[2] += r.Prize(0.5);
a[3] += r.Prize(0.99);
a[4] += r.Prize(100);
}
Assert::AreEqual(a[0], 0);
Assert::IsTrue(abs(a[1]- iNum / 10000) < iNum / 100000);
Assert::IsTrue(abs(a[2] - iNum / 2) < iNum / 20);
Assert::IsTrue(abs(a[3] - iNum *0.99) < iNum *0.99/ 10);
Assert::AreEqual(a[4], iNum);
}
相关文章
|
6月前
|
设计模式 算法 程序员
伪随机数为什么叫伪随机数
伪随机数为什么叫伪随机数
71 1
|
7月前
|
算法 编译器 C语言
生成随机数
C语言中的`rand()`函数生成0-RAND_MAX间的伪随机数,需包含`stdlib.h`。序列重复因默认种子为1,可使用`srand(unsigned int seed)`初始化,通常结合`time(NULL)`设置种子以产生不同序列。`time()`函数从1970年至今的秒数(时间戳),包含于`time.h`,用于提供变化的种子。通过`rand() % b + a`可调整生成指定范围[a, b]内的随机数。
148 3
|
C++
如何在C++中生成随机数
在C++中,生成随机数是一个常见的技术需求。本文将介绍如何在C++中使用标准库来生成随机数。
224 0
随机数,函数
1.随机一个1-10之间的小数
84 0
Random生成伪随机数
Random生成伪随机数
84 0
|
JavaScript
[随机数详解]生成一个随机数,生成指定范围的随机数及随机数组去重
写在前面: 很早之前在简书写过几篇关于随机数的文章之前写的很乱,现在重新整理一下这些知识点。本文包含了如下这些知识点:js生成随机数,生成指定范围的随机数,获得不重复随机数组。 js生成随机数。 Math.random()——生成大于等于0.0且小于1.0的一个随机数; 通常我们生成随机数都是使用这个方法,这个方法返回值是一个伪随机选择的数,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,在该范围内(近似)均匀分布。
785 0
[随机数详解]生成一个随机数,生成指定范围的随机数及随机数组去重