C语言 关于(大)随机数生成的问题

bessics 2010-08-14 01:37:43
现在我需要随机化一个内存里面的值,内存里面的值已经按照顺序排列好了。
关键就是rang()函数返回的值有个65535的范围,请问各位如何才能生成很大的随机数,最好可以支持__int64!!

我的随机算法是,随机交换内存中的值

// 随机化数组里面的值
void RandomTheAray(int *pPointer, int number)
{
//register int i;
register int *pTmp;
srand((unsigned)time(NULL));

for (pTmp = pPointer; pTmp < &pPointer[number]; pTmp++)
{
swap(pTmp, &pPointer[rand()%number]);
}
/*
for (i = 0; i < number; i++)
{
swap(&pPointer[i], &pPointer[rand()%number]);
}
*/
}
...全文
531 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bessics 2010-08-14
  • 打赏
  • 举报
回复
CryptoAPI这个貌似还不错,就是不知道效率咋样哈。
先结贴,回去研究研究。
jackyjkchen 2010-08-14
  • 打赏
  • 举报
回复
我这里有个封装好的Rand库
看看,用CryptoAPI的

Rand.h

class DLLEXPORT CRandom
{
public:
CRandom();
~CRandom();

void* GenerateRandomBlock(void *rblock,UINT bytelen);
BYTE GenerateRandomByte(BYTE &rbyte);
WORD GenerateRandomWord(WORD &rword);
DWORD GenerateRandomDWord(DWORD &rdword);
QWORD GenerateRandomQWord(QWORD &rqword);

private:
HCRYPTPROV hCryptProv;
};


Rand.cpp

#include <stdio.h>
#include "Rand.h"

CRandom::CRandom()
{
if(!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0))
puts("CryptAcquireContext Failed!");
}

CRandom::~CRandom()
{
if(hCryptProv)
if(!CryptReleaseContext(hCryptProv, 0))
puts("CryptReleaseContext Failed!");
}

void* CRandom::GenerateRandomBlock(void *rblock,UINT bytelen)
{
if(hCryptProv)
if(!CryptGenRandom( hCryptProv, bytelen, (BYTE*)rblock))
return NULL;
return rblock;
}

BYTE CRandom::GenerateRandomByte(BYTE &rbyte)
{
if(hCryptProv)
if(!CryptGenRandom( hCryptProv, sizeof(BYTE), &rbyte))
return 0;
return rbyte;
}

WORD CRandom::GenerateRandomWord(WORD &rword)
{
if(hCryptProv)
if(!CryptGenRandom( hCryptProv, sizeof(WORD), (BYTE*)&rword))
return 0;
return rword;
}

DWORD CRandom::GenerateRandomDWord(DWORD &rdword)
{
if(hCryptProv)
if(!CryptGenRandom( hCryptProv, sizeof(DWORD), (BYTE*)&rdword))
return 0;
return rdword;
}

QWORD CRandom::GenerateRandomQWord(QWORD &rqword)
{
if(hCryptProv)
if(!CryptGenRandom( hCryptProv, sizeof(QWORD), (BYTE*)&rqword))
return 0;
return rqword;
}

senlinzhiwang 2010-08-14
  • 打赏
  • 举报
回复
分两个随机数相乘,先得到一个,然后再得一个,最后把两个相乘就可以了啊。这个方法是笨了点,不过可以得到想要的结果,就是时间花费有点大。
jackyjkchen 2010-08-14
  • 打赏
  • 举报
回复
如果是Windows平台,请使用CryptoAPI,类似这样,用法msdn

if(!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0))
puts("CryptAcquireContext Failed!");
if(hCryptProv)
if(!CryptReleaseContext(hCryptProv, 0))
puts("CryptReleaseContext Failed!");
if(hCryptProv)
if(!CryptGenRandom( hCryptProv, bytelen, (BYTE*)rblock))
return NULL;
bessics 2010-08-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wing_0706 的回复:]
大数。。很多都用 字符数组存放。。。
字符数组大点。。。
[/Quote]

根据你的想法写了一个函数,但是感觉不太好。
数越大,rand()函数执行次数太多,消耗时间就越长。我测试了一下rand()100W次的时间比GenerateI64Random(7)的时间长了200ms。

// srand((unsigned)time(NULL));必须在函数外面先调用。
unsigned GenerateI64Random(int nDigits)
{
unsigned nI64Value = 0;
int i;

/*
if (nDigits > MAX)
{
printf("nDigits too big\n");
return 0;
}
*/

for (i = 0; i < nDigits; i++)
{
nI64Value = nI64Value * 10 + (unsigned)(rand()%10);
}

return nI64Value;
}
bessics 2010-08-14
  • 打赏
  • 举报
回复
rand()*rand()这个明显随机不了。随机值不连续
1 * 1 = 1;
2 * 2 = 4;
3 * 3 = 9;

...

n * n = n*n
wing_0706 2010-08-14
  • 打赏
  • 举报
回复
大数。。很多都用 字符数组存放。。。
字符数组大点。。。
yzx714 2010-08-14
  • 打赏
  • 举报
回复
把rand()*rand()的结果不就大了

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧