谢谢你以前帮我的忙。但我还有一些关于这个项目的问题。当新的随机数等于前一个随机数时,如何生成一个新的随机数?另外,如何转置矩阵?
#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;
}发布于 2009-12-17 14:42:20
我认为你应该改变这句话:
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;
}就这样..。这样,整个矩阵就会被随机值填充。不需要检查值是否已经绘制了before...since,这不是问题所在
发布于 2009-12-17 18:12:20
读取以下内容的代码部分
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);更紧凑,也更清晰。
发布于 2009-12-17 14:27:27
正如Neil所说,srand()需要在程序开始时被调用一次。每次调用srand时,您都在播种随机数生成器,但是使用这个程序,它总是以相同的时间播撒种子,所以您将得到相同的随机数。
当然,从某些定义来看,这是完全随机的:

https://stackoverflow.com/questions/1922126
复制相似问题