求随机数发生器的算法

seaymx 2002-11-08 06:06:27
在做一个小项目的时候,需要一个随机数发生器,功能要求如下:
在一个有2000多的题库中,要从当中取出30-40个题目,
要求每个题目都不重复!

我知道用rand和while可以满足要求的,但是效率不高,
大家给一个高效的办法,听说随机发生器可以满足这个要求的。
但是我不知道这个的集体做法,哪个高手可以给我解释一下,
谢谢
...全文
78 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
riverboat 2002-11-08
  • 打赏
  • 举报
回复
up
qing_li73 2002-11-08
  • 打赏
  • 举报
回复
See the link below, FYI :

http://www.game590.com/jishu.htm
qing_li73 2002-11-08
  • 打赏
  • 举报
回复


#include <memory.h>
#define DWORD unsigned long

DWORD MCoef_32[2]={0xE7BD2160,0xDA3A2A9C};
// 两个小m序列系数

DWORD m_Seq_32_m(DWORD dwMset,DWORD dwKey,int nNumber, DWORD * pdwRandom)
// dwMset: 随机发生器所使用的小m序列
// dwKey: 随机数种子
// nNumber: 产生的随机序列长度(以DWORD为单位)
// pdwRandom: 指向随机数存储空间的指针
// return value: 运算完成之后随机数发生器的状态
{
_asm
{
CLD
MOV EDI,pdwRandom;
MOV ECX,nNumber;
MOV ESI,dwMset;
MOV EAX,dwKey;
ALIGN 4
LOOP_CIRCLE1:
PUSH ECX
MOV ECX,32
LOOP_CIRCLE2:
MOV EBX,EAX;
SHL EAX,1
AND EBX,ESI; //select the bit for xor
MOV EDX,EBX;
BSWAP EBX;
XOR BX,DX;
XOR BH,BL; // because P only judge one byte
// so must XOR to judge the p of whole word
JP NEXT //jp equals the xor
INC EAX
NEXT: DEC ecx
JNZ LOOP_CIRCLE2
POP ECX
STOSD
DEC ECX
JNZ LOOP_CIRCLE1
MOV dwKey,EAX
}
return dwKey;
}

void RandomGenerator(void * Buffer, int nlength)
// 产生长度为nLength字节的随机数
// Buffer: 指向随机数存放区域的指针
// nLength: 产生随机数数量
{
DWORD A;
BYTE B[4];
_asm
{
_emit 0x0f
_emit 0x31
MOV A,EAX
}
A=m_Seq_32_m(MCoef_32[0],A,nLength/4,(DWORD *)Buffer);
if(nLength%4!=0)
{
m_Seq_32_m(MCoef_32[0],A,1,(DWORD *)B);
memcpy(Buffer+(nLength/4)*4,B,nLength%4);
}
return;
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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