如何生成一个新的随机数并转置矩阵?

时间:2009-12-17 14:23:43

标签: c arrays

感谢所有人以前帮助过我。 但我仍然对该计划有一些疑问。 如何在新的随机数等于前一个随机数时生成一个新的随机数?还有如何转置矩阵?

#include "stdafx.h" 
#include "stdlib.h"  
#include "time.h" 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int num2 = 0; 
    int num=0, i, j;      
    int mtx[9][9] = {0};  

    while (num < 3 || num > 9) {  
        printf("Enter an integer (3-9): ");  
        scanf("%d", &num);  
    }  
do 
{ 
    srand(time(NULL));  

    switch (num) 
    { 
    case 3: num2 = rand() % 8; 
        break; 
    case 4: num2 = rand() % 15; 
        break; 
    case 5: num2 = rand() % 24; 
        break; 
    case 6: num2 = rand() % 35; 
        break; 
    case 7: num2 = rand() % 48; 
        break; 
    case 8: num2 = rand() % 63; 
        break; 
    case 9: num2 = rand() % 80; 
        break; 
    } 


    for (i=0; i < num; ++i)  
        for (j=0; j < num; ++j)  
            mtx[i][j] = num2;  
} 
while ( num2 == num2); 



    for (i=0; i < num; ++i) {  
    for (j=0; j < num; ++j)  
        printf("%i ", mtx[i][j]);  
    printf("\n");  
}  



    return 0; 
} 

更新

#include "stdafx.h"
#include "stdlib.h" 
#include "time.h"


int _tmain(int argc, _TCHAR* argv[])
{
    int prevNum2 = 0;
    int num2 = 0;
    int num = 0, i, j;     // Added initializers and loop counters 
    int mtx[9][9] = {0}; // Reserve enough space for the worst-case scenario 

    while (num < 3 || num > 9) { // Added input validation loop 
        printf("Enter an integer (3-9): "); 
        scanf("%d", &num); 
    } 

    srand(time(NULL)); 

    do{

    prevNum2 =num2;
    switch (num)
    {
    case 3: num2 = rand() % 8;
        break;
    case 4: num2 = rand() % 15;
        break;
    case 5: num2 = rand() % 24;
        break;
    case 6: num2 = rand() % 35;
        break;
    case 7: num2 = rand() % 48;
        break;
    case 8: num2 = rand() % 63;
        break;
    case 9: num2 = rand() % 80;
        break;

    }




    // Loop through the matrix elements we want, filling each with a random number     
    for (i=0; i < num; ++i) 
        for (j=0; j < num; ++j) 
            mtx[i][j] = num2; 
    }
    while (num2 == prevNum2);

    /* Do something with the matrix here (display it, etc) */ 

    for (i=0; i < num; ++i) { 
    for (j=0; j < num; ++j) 
        printf("%i ", mtx[i][j]); 
    printf("\n"); 
} 



    return 0;
}

6 个答案:

答案 0 :(得分:2)

读取的代码部分

 switch (num)
   {
   case 3: num2 = rand() % 8;  break;
   case 4: num2 = rand() % 15; break;
   case 5: num2 = rand() % 24; break;
   case 6: num2 = rand() % 35; break;
   case 7: num2 = rand() % 48; break;
   case 8: num2 = rand() % 63; break;
   case 9: num2 = rand() % 80; break;
   }

可以改写为

 num2 = rand() % ((num * num) - 1);

更紧凑,更清晰。

答案 1 :(得分:1)

像Neil所说,srand()需要在程序开始时调用一次。每次你打电话给srand你都会播种随机数生成器,但是使用这个程序它总是会在同一时间播种,所以你最终会得到相同的随机数。

&LT;笑话&GT;

当然,根据某些定义,这完全是随机的:

XKCD

&LT; /笑话&GT;

答案 2 :(得分:1)

我认为你应该改变这一行:

 while ( num2 == num2); 

因为这将无限期地继续使用num2的任何值

编辑:

使我的评论清除程序在这里是使其工作的程序位:

do 
{ 
    srand(time(NULL));  

    switch (num) 

变为:

do
{
    int prevNum2 =num2;
    switch(num)

while ( num2 == num2);

变为:

while( num2 == prevNum2);

最终编辑:

在回复您的修改时。这段代码显然不是你想要的:

for (i=0; i < num; ++i) 
    for (j=0; j < num; ++j) 
        mtx[i][j] = num2; 
}

它的作用是用相同的数字填充整个矩阵。

你真正想要的(可能)是每个下一个单元格都填充不同的数字。 为此,你需要一个某种循环结构。

有些事情:

 for(int i; i<num*num; i++)
 {
      //draw random number bit (shortened for clearity... should be your whole switch bit)
      num2 = rand() % 8;

      mtx[i%num][i/num] = num2;
 }

就是这样......这样整个矩阵就会被随机值填充。无需检查值是否已在之前绘制...因为这不是问题

答案 3 :(得分:0)

DO { .. }(x == x)

是一个无限循环。你没有任何break语句可以退出。

答案 4 :(得分:0)

我认为您尝试使用从0到mtx的唯一随机整数初始化n-1中的元素,其中nmtx中的元素数量( mtx代表一个数独单元格?)。如果是这种情况:

您的for循环将mtx的所有元素设置为相同的值。所以,如果你想按照我的想法行事,那在任何情况下都无效。

您要做的是将0n-1的数字列表混洗。 Fisher-Yates shuffle非常简单有效。

如果您不想与malloc和朋友打交道,这是一种方法。

 /* maximum possible size, replace ... with actual numbers */
int list[] = {0,1,2,3,4,5,6,7,8,...,80};

/* function to shuffle the first n elements of list */
void shuffle(int *list, size_t n);

然后,当你知道num的价值时。

shuffle(list, num*num);
for (i=0; i < num; ++i)
    for (j=0; j < num; ++j)
        mtx[i][j] = list[i*num+j];

你可以摆脱所有处理随机数的代码,你的do...while循环等等。

我没有为你写shuffle(),因为我认为这对你来说是一个有趣的练习。 : - )

最后,提示:

printf("Enter an integer (3-9): ");
在您上面调用printf()时,

可能不会显示给用户,因为在许多系统上默认情况下stdout是行缓冲的。要确保在程序等待输入之前显示它,请执行以下操作:

fflush(stdout);

在尝试阅读输入之前。这将确保提示正确显示。

答案 5 :(得分:0)

我认为,在没有根本改变的情况下解决这个问题的最简单方法是消除do-while循环。如果你想生成一个矩阵(或对矩阵的每个元素做任何事情 - 显示,修改等......),最简单的方法是在双嵌套for循环中工作。你的变量'prevnum2'并不是真的需要。

for (i = 0; i < num; i++) {
  for (j = 0; j < num; j++) {
    switch (num) {  // generate a random number
      ...
    }

    mtx[i][j] = num2;  // store the random number in the matrix
  }
}

当你在编程生活中向前和向上移动时,你肯定想要了解Alok对于更好的随机数生成技术的出色建议。