我在网站上搜索这个问题,其中一个对我有所帮助。 我想制作一个1至9之间随机数的拼图,我使用这种方法:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int i = 1, num[9] = {1,2,3,4,5,6,7,8,9}, k = 1;
srand(time(NULL));
for (i = 1; i < 10; i++) {
num[i] = i;
}
for (i = 1; i < 10; i++) {
int j = i + rand()%(10 - i);
int temp = num[i];
num[i] = num[j];
num[j] = temp;
if ((i - 1) % 3 == 0)
{
printf(" %i: ", k);
k++;
}
printf(" %i", num[i]);
if (i % 3 == 0)
{
printf("\n");
}
}
return 0;
}
但我有这个code.it的问题,使最后两个数字相同! 谁能帮助我?
答案 0 :(得分:3)
您可以像这样生成一系列独特的随机数。它的工作原理是创建一个包含所有可用数字的池,随机选择一个,然后从池中删除该数字。同样的方法可以用来处理一副牌,而不需要明确地改组。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define RANGE 9 // range of numbers
int main() {
int pool[RANGE];
int size, n;
for (size=0; size<RANGE; size++) {
pool[size] = size+1; // create number pool 1...
}
srand((unsigned)time(NULL));
while (size) { // generate random sequence
n = rand() % size; // random array index
printf("%d ", pool[n]); // select number from pool
pool[n] = pool[--size]; // remove from pool
}
printf("\n");
return 0;
}
这也是您程序的调试版本。除了错误的数组索引之外,你的错误是在随机化完成之前从数组中打印。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int i = 1, num[9] = {1,2,3,4,5,6,7,8,9};
srand((unsigned)time(NULL));
for (i=0; i<9; i++) {
int j = rand() % 9;
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
for (i=0; i<9; i++) {
if (i % 3 == 0)
printf("\n %d: ", 1+i/3);
printf(" %i", num[i]);
}
printf("\n");
return 0;
}
答案 1 :(得分:0)
#include <stdio.h>
#include <stdlib.h>
void shuffle( int* pack, int length )
{
int i ;
// Initialise pack
for( i = 0; i < length; i++ )
{
pack[i] = i + 1 ;
}
// Swap random pairs
for( i = 0; i < length; i++ )
{
int n = rand() % length ;
int m = rand() % length ;
int h = pack[n] ;
pack[n] = pack[m] ;
pack[m] = h ;
}
}
#define PACK_LENGTH 9
int main(void)
{
int i ;
int pack[PACK_LENGTH] ;
srand( time(0) ) ;
// Create and shuffle the pack
shuffle( pack, pack_length ) ;
// Print the pack
for( i = 0; i < pack_length; i++ )
{
printf( "%d ", pack[i] ) ;
}
return 0;
}