感谢所有人以前帮助过我。 但我仍然对该计划有一些疑问。 如何在新的随机数等于前一个随机数时生成一个新的随机数?还有如何转置矩阵?
#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;
}
答案 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;
当然,根据某些定义,这完全是随机的:
&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
中的元素,其中n
是mtx
中的元素数量( mtx
代表一个数独单元格?)。如果是这种情况:
您的for
循环将mtx
的所有元素设置为相同的值。所以,如果你想按照我的想法行事,那在任何情况下都无效。
您要做的是将0
到n-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对于更好的随机数生成技术的出色建议。