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 从向量中选择一个数字并将其删除的主要内容,如果未能解决你的问题,请参考以下文章

如何从向量或数组中选择最常见的数字?(TOP5 toplist)C++

选择一个点的邻域并将其转换为向量

给出向量中有多少个小于自身的数字

如何使用 cin 将整数从控制台读取到向量中

了解向量乘法

从向量中正确访问对象的属性并将其清除