我想创建一个只有两个值的多维数组:0或1。
我使用srand / rand函数但是数组只包含0。 这是代码:
#define NB_LINE 4
#define NB_COLUMN 11
int tab[NB_LINE][NB_COLUMN] ; // global variable
void generate() {
srand((unsigned int)time(NULL));
int n, i, j;
for(n = 0; n < NB_LINE*NB_COLUMN; ++n){
do
{
i = rand() % NB_LINE;
j = rand() % NB_COLUMN;
}
while (tab[i][j] != 0);
tab[i][j] = 1 ;
}
}
我不知道如何解决这个问题?
谢谢!
编辑:感谢您的回答。你认为rand()有可能每列有一个“1”而其他点只有0吗?
答案 0 :(得分:4)
你的循环不符合你的想法。试试这个:
int tab[NB_LINE][NB_COLUMN] ; // global variable
void generate() {
srand((unsigned int)time(NULL));
int i, j;
for (i=0; i < NB_LINE; ++i) {
for (j=0; j < NB_COLUMN; j++) {
tab[i][j] = rand() % 2;
}
}
}
最后,您将拥有一个数组,其中每个点随机有1或0。
答案 1 :(得分:2)
我想创建一个只有两个值的多维数组:0或1
您应该在生成的随机数上使用 2 %
。有了这个提示,试着让程序更简单易懂。为什么不直接填充数组的每个元素顺序?
答案 2 :(得分:0)
编辑问题
您是否认为rand()每列只有一个“1”而其他点只包含0?
是的,当然。
不是循环遍历所有行和所有列,而是将每个单独的数组元素设置为随机值0
或1
,而是将所有数组元素初始化为0(如果它们尚未);遍历所有列并选择1个随机行并将相应的数组元素设置为1
。
#include <stdlib.h>
#include <string.h> // memset
#include <time.h>
void generate(int *arr, size_t lines, size_t columns) {
int col, row;
memset(tab, 0, lines * columns * sizeof *arr);
for (col = 0; col < columns; col++) {
row = rand() % lines;
tab[row * columns + col] = 1;
}
}
int main(void) {
int tab[NB_LINE][NB_COLUMN];
srand(time(0)); /* no casts */
generate(&tab[0][0], NB_LINE, NB_COLUMN);
/* ... */
}
注意我已从srand()
功能中删除了generate()
。每个程序调用应该调用srand()
不超过一次(以保证最大的随机性)。实现这一目标的最佳方法是从srand
致电main()
另外,我将变量i
和j
命名为row
和col
,而不是tab
和{{1}}。
并且,我已将{{1}}设为局部变量而非全局变量。 尽可能避免使用全局变量:这对你自己有利。没有全局变量,信息将通过参数传递给函数。