【问题标题】:Matrix with random numbers from 1 to 52 not repeated but keeps repeat always 1 number随机数从 1 到 52 的矩阵不重复但始终重复 1 个数字
【发布时间】:2014-01-10 23:17:18
【问题描述】:

我正在用 C 编写一个项目,我试图创建一个从 1 到 52 的随机数不重复但始终重复 1 个数字的矩阵!

void baralhar(int b[]){
int x,y,r;
for(x=0;x<53;x++){
    r=rand() % 52+1;

    for(y=0;y<=x;y++){
        if(r==b[y])
        {
            y=0;
            r=rand() % 52+1;
        }
    }
    b[x]=r;
}

}

输出: 49 2 3 23 15 50 29 12 33 37 6 21 9 16 14 38 41 31 36 10 39 43 40 30 48 7 4 8 5 18 34 46 1 47 27 13 51 42 17 19 25 20 26 35 28 52 49 45 24 32 22 44

在这个例子中你可以看到数字 49 是重复的。你能帮忙吗?

【问题讨论】:

标签: c random matrix repeat


【解决方案1】:

您用 52 个不同的数字填充 53 个元素的数组。很明显,你会重蹈覆辙。

如 cmets 中所述,检查如何置换 52 个数字,并使您的数组大小匹配 52。

编辑:此外,您将始终重复第一次绘制(位置 0 的元素)。您重置 y=0,但是当您到达循环末尾时,y 计数为 1。因此位置 0 不受保护以防止重复。

【讨论】:

  • 你先生是个天才 :D 如此明显的错误,我找不到它非常感谢
【解决方案2】:

您应该首先生成一个从 1 到 52 的数字序列,然后将它们随机排列。这样可以确保没有重复。

以下代码使用 Fisher-Yates shuffle 算法。

#include <stdio.h>
#include <time.h>

int main(void)
{
    int numbers[52];
    int i, j, temp;
    srand(time(NULL));

    // putting numbers from 1 to 52 into the 'numbers' array
    for(i=0; i<52; i++)
        numbers[i] = i + 1;

    // shuffling using Fisher-Yates shuffle algorithm
    for(i=51; i>=1; i--)
    {
        // very important: pick a random number from 1 to i
        j = rand()%(i+1);

        // swapping two numbers
        temp = numbers[i];
        numbers[i] = numbers[j];
        numbers[j] = temp;
    }

    // printing the array
    for(i=0; i<52; i++)
        printf("%d, ", numbers[i]);

    return 0;
}

这是一个演示:http://ideone.com/T5AXkM,这是一个很好的逐步解释该算法如何工作的说明:http://www.youtube.com/watch?v=tLxBwSL3lPQ。

【讨论】:

  • +1 喜欢 Fisher-Yates 的引用,但更喜欢 inside-out
  • 谢谢你让我知道如何开始制作有序矩阵,然后如何洗牌。荣誉
【解决方案3】:

首先,内部循环(用于y)检查从b[0] 到b[x] 的“先前”数组元素。但是元素b[x] 那时没有初始化。它包含一个垃圾值(或最初在b 中的任何值)。将r 与b[x] 进行比较是没有意义的。你的内循环应该停止检查b[x - 1]。

其次,正如在另一个答案中已经提到的那样,将y 重置为0 后,y 立即被循环递增。因此,大多数情况下,您的代码在检查重复时会忽略 b[0]。

第三,您的rand() % 52 + 1 表达式只能生成 52 个唯一数字,而您的代码被编写为生成 53。您的代码应该永远循环。 (由于第二个错误,它不会永远循环)。在您的问题标题中,您说您需要 52 个数字。那为什么你的外循环要写成 53 次迭代呢?

【讨论】:

    【解决方案4】:
    void baralhar(int b[])
    {
    
    int x,y,r;
    
    for(x=0;x<52;x++)
    
    {
          r=rand() % 52+1;
          for(y=0;y<=x;y++)
          {
                if(r==b[y])
                {
                     y=-1;
                     r=rand() % 52+1;
                }
          }
          b[x]=r;
    }
    

    只需在第一个循环中更改为 "for(x=0;x;x++)

    而不是重置 y=0 使其 y=-1

    这将解决上一条评论的第二个和第三个问题

    那么第一个关注点会自动消失..

    【讨论】:

      猜你喜欢
      • 2020-05-18
      • 2015-09-30
      • 2017-07-25
      • 2017-05-28
      • 2013-11-12
      • 2018-09-09
      • 2018-06-04
      • 2011-08-04
      • 2013-01-02
      相关资源
      最近更新 更多