2009-12-17 118 views
0

感谢所有帮助过我。 但我仍然有关于该计划的一些问题。 如何生成一个新的随机数,而新的随机数等于先前的随机数?另外如何转置矩阵?如何生成一个新的随机数并转置矩阵?

#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; 
} 
+2

将srand()移出循环。阅读随机数字生成中的许多问题。 – 2009-12-17 14:25:36

+0

这是做你正在做的事情的极其无效的方式。你想把所有数字从'0'分配到'n-1'('n = num * num')到'mtx'。生成范围为“0”到“n-1”的随机数,然后检查它是否尚未生成变得非常慢,因为可用数字池变得更小。例如,当您生成80个这样的号码时,您知道第81号码应该是什么,但按照您的算法进行操作可能需要很长时间才能找到您想要的号码。你正在寻找的是一种混合'0'和'num * num-1'之间数字的方法。 – 2009-12-18 18:24:19

回答

1

我想你应该改变这一行:

while (num2 == num2); 

由于这将无限期地继续下去了NUM2的任何值

编辑:

这里做我的评论cleaerer是编程位,使其工作:

do 
{ 
    srand(time(NULL)); 

    switch (num) 

变为:

do 
{ 
    int prevNum2 =num2; 
    switch(num) 

and

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; 
} 

完蛋了......这样整个矩阵被填满随机值。无需检查该值是否已经绘制过...因为这是没有问题的

+0

我认为这个陈述也是错误的,但我怎么能纠正它? 我想表示“while(new ranNum == previos ranNum);” – 2009-12-17 14:48:12

+0

完全按照您刚刚键入的方式进行操作。开关类型之前:int prevNum2 = num2; ...和while成为:while(num2 == prevNum2) – Toad 2009-12-17 15:11:08

+0

作为旁注:有这样一个条件打败了rand()的目的。完全有可能有两个随机数字相同(尤其是使用如此小的数字范围)。随着你的病情,你有效地削弱了随机分布。 – Toad 2009-12-17 15:12:41

1

像尼尔说,srand()函数需要被调用一次,在节目的开头。每次你打电话给srand时,你都会播种随机数字发生器,但是通过这个程序它总是会被播种,所以你最终会得到相同的随机数字。

<笑话>

当然,这是完全足够随机的一些定义:

XKCD

< /笑话>

+0

哦... srand()循环后仍然不工作。 – 2009-12-17 14:32:20

+0

不工作是什么意思? – Skilldrick 2009-12-17 14:36:16

+0

输入数字后,仍然没有打印出来。 – 2009-12-17 14:37:30

0

做 { .. }(X == X)

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

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); 

这是更紧凑的,可以说是更清晰。

0

我想你想用独特的随机整数初始化元素mtx从0到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); 

你尝试读取输入之前。这将确保提示得到正确显示。

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对于更好的随机数生成技术的出色建议。