随机数的高级玩法
随机数的高级玩法
场景介绍
我司要从27人中选出3位参加周三的代表大会,其中有3人之前参与过我司的其他活动,这次可以免参。打算写一个程序来从剩下的24人中随机生成3位,为了保证绝对的公平,让这个过程重复3次,每次从选出的三人中随机选一人。为了防止每次运行都不一样,这里不使用 srand( (unsigned)time(NULL) ) 【需要添加 #include
程序逻辑框架如下
代码如下
#include
#include
#include using namespace std;int main(int argc, char* argv[])
{cout << "随机产生 3 位参加周三党代表投票的党员:" << endl << endl;vector<string> VechicleDesign1st = { "冯宪光", "魏瑞悦","东泽源","Gideon","彭海德","钟恒", "丁欣鑫","汤正英","张明明","高世哲","蔡世成","付利荣","王洪帅","邓舒文","孙荣健","杨孟欣","魏文涛","余洁", "陈上", "王超", "吴鹏", "焉兆民","刘皓林","滕晨浩" };// 金田、刘晴天、崔丽萍免除在外,因为参与团建指导员了vector<int> Flags; // 保存随机选取序号vector<string> Member; // 保存随机选取的名字int Ra = 0; // 随机数// 随机循环3次for (int j = 0; j < 3; ++j){cout << "随机 第 " << j+1 << " 次:\n";// 每次随机选取3个名字for (int i = 0; i < 3; ++i){Ra = rand() % 24; //生成[0,24)区间随机数string name = VechicleDesign1st[Ra]; //获取对应的名字cout << i + 1 << ": " << name << endl ;Member.push_back(name); //存储随机选出的名字}int m = 0;m = rand() % 3; //生成[0,3)区间随机数cout << "取第 " << m+1 << "位\n" << endl; // 随机选取3个中的一个Flags.push_back(m); //存储选择序号}// 输出最终结果cout << "最终参与周三投票的为:\n";for (int i = 0; i < 3; ++i){int temp = 3 * i + Flags[i];cout << i + 1 << ": " << Member[ temp] << endl;}return 0;}
以下是输出结果

就是因为没有加 time,无论程序运行多少次,结果都是一样的,这是保证绝对公平的关键。
显然,输出的结果并不理想,有名字重复了,需要设置不生成重复的随机数才行。
其实方法很多,有博主介绍说,先创建一个一定范围数字的数组,或vector,然后调用 random_shuffle(begin, end) 洗牌函数打乱这个数组就可以了,参考C++产生一定范围内不重复的随机数。
以下是改进后的程序
#include
#include
#include
#include // 洗牌函数对应的头文件using namespace std;int main(int argc, char* argv[])
{cout << "随机产生 3 位参加周三党代表投票的党员:" << endl << endl;vector<string> VechicleDesign1st = { "冯宪光", "魏瑞悦","东泽源","Gideon","彭海德","钟恒", "丁欣鑫","汤正英","张明明","高世哲","蔡世成","付利荣","王洪帅","邓舒文","孙荣健","杨孟欣","魏文涛","余洁", "陈上", "王超", "吴鹏", "焉兆民","刘皓林","滕晨浩" };// 金田、刘晴天、崔丽萍免除在外,因为参与团建指导员了vector<int> Flags;vector<string> Member;vector<int> Random; // 新增加一个 Vector 对象// 生成[0,23]区间数组for (int i=0; i<24; ++i){Random.push_back(i);}random_shuffle(Random.begin(), Random.end()); // 打乱数组中的数据元素int n = 3;int Ra = 0;for (int j = 0; j < 3; ++j){cout << "随机 第 " << j+1 << " 次:\n";for (int i = 0; i < n; ++i){//Ra = rand() % 24; //生成[0,24)区间随机数Ra = Random[3*j + i]; //直接使用数组中的元素// 后面都一样string name = VechicleDesign1st[Ra];cout << i + 1 << ": " << name << endl ;Member.push_back(name);}int m = 0;m = rand() % 3;cout << "取第 " << m+1 << "位\n" << endl;Flags.push_back(m);}cout << "最终参与周三投票的为:\n";for (int i = 0; i < 3; ++i){int temp = 3 * i + Flags[i];cout << i + 1 << ": " << Member[ temp] << endl;}return 0;}
改进之后的结果

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
