Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组中的随机数和C中的delete_C_Arrays_Random - Fatal编程技术网

数组中的随机数和C中的delete

数组中的随机数和C中的delete,c,arrays,random,C,Arrays,Random,我正在写一个非常简单的程序,但我似乎无法让它正常工作。我想从一个数字为1-69的数组开始,然后从该数组中随机选择5个数字,而不重复。我不想只是洗牌数组,然后取前5个数字。我希望它更像是一个从帽子里拿出来的暗数字,概率是它应该的样子。 例如: 数组1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] Array2[] //我希望它从Array1中随机选择一个元素,将其从Array1中移除,然后将其放置在Array2中。然后重复这个过程,直到我从

我正在写一个非常简单的程序,但我似乎无法让它正常工作。我想从一个数字为1-69的数组开始,然后从该数组中随机选择5个数字,而不重复。我不想只是洗牌数组,然后取前5个数字。我希望它更像是一个从帽子里拿出来的暗数字,概率是它应该的样子。 例如:

数组1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]

Array2[]

//我希望它从Array1中随机选择一个元素,将其从Array1中移除,然后将其放置在Array2中。然后重复这个过程,直到我从数组1中随机抽取了5个数字,不再重复

非常感谢您的帮助!谢谢大家!

另外,我正在用C写这个项目。

你不能简单地“删除”C数组中的一个单元格;如果你真的想这样做,最好的办法是:

  • 选择秩为n的元素(从数组A中)并对其执行任何操作
  • memcpy
  • 记住数组A的新大小(因为分配的内存在整个过程中保持不变)
  • 你绝对需要“尝试一下”,发布你的作品,并就你尝试过的东西提出问题。特别是如果这是家庭作业,我们不能“为你做你的工作”:(

  • 有很多方法可以做到这一点

  • 一些示例选项:

    a) 用“合法”数字填充数组,从五个随机位置中选择五个数字,然后将这些位置标记为“已采取”(这样它们就不会被再次选择)

    b) 用合法数字随机填充数组,并从位置“0”开始一次选择五个。每次将当前位置增加“五”

    c) 等等

  • 伪代码:

  • 使用值[1…69]创建69元素数组
    A[]
    <代码>长度=69

  • 随机创建一个索引
    index=rand()%Length

  • 将索引元素
    A[index]
    与数组元素
    A[Length-1]
    交换

  • 减量:
    长度--

  • 再重复步骤2-4四次

  • A[]
    的最后五个元素是所需的集合-无重复

  • 注意:代码没有洗牌整个数组-这将是一种浪费时间的行为。

    “我希望它更像是帽子里的黑暗数字。”这正是您可以实现的方法:

    • 创建一个包含所有彩票的
      hat
      数组
    • 从数组中选择一个随机票证,存储它并从帽子中移除票证
    • 重复上述步骤,直到您拥有所需数量的车票
    从数组中删除需要移动数组的尾部,但这里不需要这样做:hat中项目的顺序并不重要,因此可以将最后一个元素移动到已绘制票证在数组中留下的间隙,并减小数组长度

    因此:

    #包括
    #包括
    #包括
    int main()
    {
    int hat[70];//数字池
    大小\u t n=70;//池的大小
    尺寸i;
    //获取伪随机数生成器
    srand(时间(空));
    //用所有数字填充池
    对于(i=0;i

    在您的例子中,与池相比,绘制的数字的数量很小,因此您实际上可以从另一个角度来看问题:不限制绘制的项目,您可以查看您已经绘制的项目并绘制一张罚单,直到获得一张您尚未看到的罚单。但上述方法是通用的。

    请在下次之前展示您的研究成果。请先阅读第页。最近有几个关于这个主题的问题。稍微搜索一下C页面上的random,更一般地说,是Fisher-Yates shuffle。数学上正确的方法是洗牌并选择前五个循环——你可以在五个循环后缩短洗牌时间,这样你就不必洗牌所有69个项目。事实上,你认为这在某种程度上不是“恰当地”模拟从帽子上画出而不替换,这只是你人类思维的偏见。学习数学,把它做好。
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    
    int main()
    {
        int hat[70];        // pool of numbers
        size_t n = 70;      // size of pool
        size_t i;
    
        // get pseudo-random-number generator underway
        srand(time(NULL));
    
        // fill pool with all numbers
        for (i = 0; i < n; i++) hat[i] = i;
    
        // pick five numbers and print them
        for (i = 0; i < 5; i++) {
            size_t pick = rand() % n;
    
            printf("%d\n", hat[pick]);
            hat[pick] = hat[--n];
        }
    
        return 0;
    }