关于random_shuffle()函数生成不重复随即数的问题

神的理想 2013-12-05 09:55:13
需要在一个文件内洗200次牌,但是用random_shuffle()函数返回的值有时候是重复的,不知道程序那里出问题了,请各位大侠帮助看下程序那里有问题!

char *s16[MAX]={
"0x01","0x02","0x03","0x04","0x05","0x06","0x07","0x08","0x09","0x0A","0x0B","0x0C","0x0D",
"0x11","0x12","0x13","0x14","0x15","0x16","0x17","0x18","0x19","0x1A","0x1B","0x1C","0x1D",
"0x21","0x22","0x23","0x24","0x25","0x26","0x27","0x28","0x29","0x2A","0x2B","0x2C","0x2D",
"0x31","0x32","0x33","0x34","0x35","0x36","0x37","0x38","0x39","0x3A","0x3B","0x3C","0x3D","0x4E","0x4F" };
class MyRand
{
public:
int operator()(int index)
{
return rand() % POKER_NUM;
}
};

int xipai_test()
{
int a,c;
int min = 1;
int max = 2;
cout <<"请输入[起始]文件编号:"<<endl;
cin >>min;
cout <<"请输入[结束]文件编号:"<<endl;
cin >>max;

// 用时间创建目录
char dir[64];
SYSTEMTIME sys;
GetLocalTime( &sys );
sprintf(dir,"%d_%d_%d_%d_%d_%d_%d",sys.wYear ,sys.wMonth ,sys.wDay ,sys.wHour ,sys.wSecond ,sys.wMinute ,sys.wMilliseconds);
_mkdir(dir);


srand( (unsigned)time(NULL) ); //设置随即数生成器的种子
vector<int> poker; //一副牌,牌点数从 1 计

for(c=min;c<=max;c++)
{
ofstream out;
char buffer [256] ;
strcpy(buffer,dir);
char buffer2 [128] ;
sprintf(buffer2,"/moto%d.ini",c);
strcat(buffer,buffer2);
cout <<"buffer:"<<buffer<<endl;
out.open(buffer);


//初始化
for (int num = 1; num <= POKER_NUM; num++)
{
poker.push_back(num);
}
for (int w = 1; w <= 200; w++)
{
out<<"[Table"<<w<<"]"<<endl;
//用默认随机数洗一遍
//random_shuffle(poker.begin(), poker.end());
//for_each(poker.begin(), poker.end(), print_poker);
//cout << endl;
Sleep(1);
//用自定义随机数再洗一遍
random_shuffle(poker.begin(), poker.end(), MyRand());
//copy(poker.begin(), poker.end(), ostream_iterator<int>(cout, " "));
//cout << endl<< endl;

for (int num = 0; num < POKER_NUM; num++)
{
int idx =poker.at(num);
if (idx && idx >= 0 && idx < 54)
out<<"readBuffer"<<num+1<<"="<<s16[idx-1]<<endl; //输出16进制
}

}
out.close();
}
return 1;
}
...全文
190 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
神的理想 2013-12-05
  • 打赏
  • 举报
回复
引用 1 楼 turingo 的回复:
1、检查一下POKER_NUM和MAX是否不匹配; 2、检查一下for (int num = 1; num <= POKER_NUM; num++)和for (int num = 0; num < POKER_NUM; num++)是否不一致。 [/code]
[/quote] 1.POKER_NUM和MAX都是54 2.最后一个for (int num = 0; num < POKER_NUM; num++) 是用于poker.at(num);取值用的,应该不是吧?
图灵狗 2013-12-05
  • 打赏
  • 举报
回复
1、检查一下POKER_NUM和MAX是否不匹配; 2、检查一下for (int num = 1; num <= POKER_NUM; num++)和for (int num = 0; num < POKER_NUM; num++)是否不一致。
引用 楼主 zhouxicai 的回复:
需要在一个文件内洗200次牌,但是用random_shuffle()函数返回的值有时候是重复的,不知道程序那里出问题了,请各位大侠帮助看下程序那里有问题!

char *s16[MAX]={
	"0x01","0x02","0x03","0x04","0x05","0x06","0x07","0x08","0x09","0x0A","0x0B","0x0C","0x0D",
	"0x11","0x12","0x13","0x14","0x15","0x16","0x17","0x18","0x19","0x1A","0x1B","0x1C","0x1D",
	"0x21","0x22","0x23","0x24","0x25","0x26","0x27","0x28","0x29","0x2A","0x2B","0x2C","0x2D",
	"0x31","0x32","0x33","0x34","0x35","0x36","0x37","0x38","0x39","0x3A","0x3B","0x3C","0x3D","0x4E","0x4F" };
class MyRand
{    
public:
    int operator()(int index)
    {
        return rand() % POKER_NUM;
    }
};

int xipai_test()
{
	int a,c;
	int min = 1;
	int max = 2;
	cout <<"请输入[起始]文件编号:"<<endl;
	cin >>min;
	cout <<"请输入[结束]文件编号:"<<endl;
	cin >>max;

	// 用时间创建目录
	char dir[64];	
	SYSTEMTIME sys; 
	GetLocalTime( &sys ); 
	sprintf(dir,"%d_%d_%d_%d_%d_%d_%d",sys.wYear ,sys.wMonth ,sys.wDay ,sys.wHour ,sys.wSecond ,sys.wMinute ,sys.wMilliseconds);
	_mkdir(dir);


    srand( (unsigned)time(NULL) ); //设置随即数生成器的种子
    vector<int> poker; //一副牌,牌点数从 1 计
	
	for(c=min;c<=max;c++)
	{
		ofstream out;
		char buffer [256] ;
		strcpy(buffer,dir);
		char buffer2 [128] ;
		sprintf(buffer2,"/moto%d.ini",c);
		strcat(buffer,buffer2);
		cout <<"buffer:"<<buffer<<endl;
		out.open(buffer);


		//初始化
		for (int num = 1; num <= POKER_NUM; num++)
		{
			poker.push_back(num);
		}
		for (int w = 1; w <= 200; w++)
		{
			out<<"[Table"<<w<<"]"<<endl; 
			//用默认随机数洗一遍
			//random_shuffle(poker.begin(), poker.end());
			//for_each(poker.begin(), poker.end(), print_poker);
			//cout << endl;
			Sleep(1);
			//用自定义随机数再洗一遍
			random_shuffle(poker.begin(), poker.end(), MyRand());
			//copy(poker.begin(), poker.end(), ostream_iterator<int>(cout, " "));
			//cout << endl<< endl;    

				for (int num = 0; num < POKER_NUM; num++)
				{
					int idx =poker.at(num);
					if (idx && idx >= 0 && idx < 54)
					out<<"readBuffer"<<num+1<<"="<<s16[idx-1]<<endl;    //输出16进制
				}
			
		}
		out.close();
	}
	return 1;
}

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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