Randomizer 从向量中选择一个数字并将其删除
Posted
技术标签:
【中文标题】Randomizer 从向量中选择一个数字并将其删除【英文标题】:Randomizer picks a number from the vector and delete it 【发布时间】:2020-05-31 09:24:52 【问题描述】:所以,程序从向量中选择这个数字,它实际上是一个序列 1...n,我想打印出来并从中删除随机数。但是,每次程序都会打印出 n...1 序列。 示例: Vector(1,2,3,4,5) => 程序选择随机数 4 => Vector(1,2,3,5) => 随机数 1 => Vector(2,3,5) 直到向量()。因此,程序将打印 (4,1,...)。 对于这个程序,它总是为 Vector(1,2,3,4,5) 打印出 (5,4,3,2,1)。
int main()
srand(time(NULL));
rand();
int toReturn;
std::cout << "Enter the number of tickets: ";
std::cin >> toReturn;
std::cout << std::endl;
std::vector<int> nums;
for (int i = 1; i <= toReturn; ++i)
nums.push_back(i);
int choice=0;
bool checked=0;
while (nums.size() > 0)
bool inVector=0;
choice = rand() % toReturn + 1;
while(inVector == 0)
choice = rand() % toReturn + 1;
for (int i = 0; i < nums.size(); ++i)
if (choice == nums[i])
inVector = 1;
else
inVector = 0;
std::cout << "Why not check the ticket " << choice << std::endl;
std::cout << "Did u do it right?" << std::endl;
std::cin >> checked;
if (checked)
nums.erase(std::remove(nums.begin(), nums.end(), choice), nums.end());
else
continue;
if (nums.size() == 0)
std::cout << "You checked all tickets!!!";
return 0;
如果您对代码重构有任何建议,我会很高兴
感谢大家的帮助,这样用 std::random_shuffle 完全重写我的程序:
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <random>
int main()
int toReturn;
std::cout << "Enter the number of tickets: ";
std::cin >> toReturn;
std::cout << std::endl;
std::vector<int> nums;
for (int i = 1; i <= toReturn; ++i)
nums.push_back(i);
std::random_device rd;
std::mt19937 g(rd());
int choice = 0;
std::shuffle(nums.begin(), nums.end(), g);
while (nums.size() > 0)
bool checked = 0;
choice = 0;
std::cout << "Why not to check " << nums[choice];
std::cout << std::endl << "Did you do it right?";
std::cin >> checked;
if (checked == 1)
nums.erase(std::remove(nums.begin(), nums.end(), nums[choice]), nums.end());
choice++;
std::cout << "You checked all tickets!!!";
return 0;
【问题讨论】:
如果这类似于抽奖,那么, 1. 用数字域填充向量。 2. 洗牌向量。 3.将矢量调整为编号。的选择。 4. 就是这样。如果您愿意,可以对它们进行排序,但这会给您从一些固定(且相当小的)域大小 M 的序列中随机选择 N 个,其中 M >= N。关于您的代码。问问自己inVector
到底是干什么用的,更重要的是,当你发现等价时你是否应该break
,从而进一步指出它是否有用。在for循环的生命周期中会发生什么?
【参考方案1】:
问题出在你的 for 循环中。即使它找到一个数字,例如。 1 存在于 [1 2 3 4 5] 中并设置
inVector = 1
它将继续检查nums中的下一个数字并最终设置
inVector = 0
除非是最后一个数字。
您必须在满足条件时终止循环,例如。
if (choice == nums[i])
inVector = 1;
break;
【讨论】:
【参考方案2】:也许你应该改变这一行
if (choice == nums[i])
到这里:
if (choice <= nums[i])
【讨论】:
以上是关于Randomizer 从向量中选择一个数字并将其删除的主要内容,如果未能解决你的问题,请参考以下文章