【发布时间】:2015-03-13 19:24:27
【问题描述】:
这是我的程序的代码。它应该从用户那里获取两个数字,然后使用 rand 函数生成随机数。 但是当我编译它时,数字不是随机的。
我也用java写过这个,而且效果很好。
C 版:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int cmpfunc();
int main()
{
puts("How many numbers do you want to generate?");
int n;
scanf("%d", &n);
int numbers[n];
puts("What should be the largest number possible?");
int m, i;
scanf("%d", &m);
int result[m];
for(i=0;i<m;i++)
numbers[i] = i + 1;
srand(time(NULL));
for(i=0;i<n;i++)
{
int r = rand() % m;
result[i] = numbers[r];
numbers[r] = numbers[m - 1];
m--;
}
qsort(result, n, sizeof(int), cmpfunc); //sorting the result array
for(i=0;i<n;i++)
{
printf("%d\n", result[i]);
}
getch();
return 0;
}
int cmpfunc (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
编辑:srand 在循环中,人们说它不应该被多次调用。所以我把它拿出来了,但这没有用。
Java 版本:
import java.util.*;
public class RandomNumberGenerator {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("How many numbers do you want to generate?");
int n = in.nextInt();
System.out.println("What should be the largest number possible?");
int m = in.nextInt();
int numbers[] = new int[m];
for(int i=0;i<numbers.length;i++)
numbers[i] = i + 1;
int result[] = new int[n];
for(int i=0;i<result.length;i++)
{
// make a random index between 0 and n - 1
int r = (int) (Math.random() * m );
result[i] = numbers[r];
// move the last element into the random location
numbers[r] = numbers[m - 1];
m--;
}
System.out.println("Do you want the result to be sorted? (1 for Yes, others for No)");
int ans = in.nextInt();
if(ans==1)
Arrays.sort(result);
System.out.println("Result:");
for (int r : result)
System.out.println(r);
pressAnyKeyToContinue();
}
private static void pressAnyKeyToContinue()
{
System.out.println("Press Enter to continue.");
try
{
System.in.read();
}
catch(Exception e)
{}
}
}
编辑 2:
c 输出:(不是随机的,排序的)
java 输出:(随机、排序)
编辑 3:
正如我在 cmets 中所述的值是: n= 55 m= 9808
我也在使用代码块,所以头文件并不是一个真正的问题。它们由代码块自动加载。
编辑 4:
人们的建议给我留下了深刻的印象。 qsort 在生成随机数时不会改变任何事情。它只是对数组进行排序。所以即使我删除它,它也不会改变任何东西。
在随机数数组中,我们期望任何两个相邻元素之间的差异也是随机的。此属性在排序下保留。我对 C 和 Java 中的随机数进行排序以检查此属性。如您所见,在 C 代码中,相邻元素之间的差异都是相同的。这让我相信 C 代码不会生成随机数,但 Java 代码会。
编辑 5:
我确信java和c之间的算法应该没有区别。
编辑 6:
对不起,我不是专业人士。我只是想制作我拥有的 Java 程序的 C 版本。一个固定的代码将不胜感激。
****编辑最终结果:** 终于让它工作了。分别存储 n 和 m 的数组“数字”和“结果”应该存储 m 和 n。就这样。除此之外,我根据人们的建议更改了他们的名字。有些人告诉我用数组暗淡切换变量 m 和 n。事实并非如此。 这是任何有兴趣的人的固定代码:**
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int cmpfunc();
int main()
{
puts("How many numbers do you want to generate?");
int num_numbers;
scanf("%d", &num_numbers);
puts("What should be the largest number possible?");
int num_maximum, i;
scanf("%d", & num_maximum);
int numbers[num_maximum];
int result[num_numbers];
for(i=0;i<num_maximum;i++) // making
numbers[i] = i + 1;
srand(time(NULL)); // seeding rand
for(i=0;i<num_numbers;i++)
{
int r = rand() % num_maximum; // generates random number between 0 and m-1
result[i] = numbers[r]; //
numbers[r] = numbers[ num_maximum - 1];
num_maximum--;
}
puts("Do you want the result to be sorted?");
int ans;
scanf("%d", &ans);
if (ans==1)
qsort(result, num_numbers, sizeof(int), cmpfunc); //sorting the result array
for(i=0;i< num_numbers;i++)
{
printf("%d\n", result[i]);
}
getch();
return 0;
}
int cmpfunc (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
【问题讨论】:
-
可能想read this。
-
posted code is missing #include
getch() is found in the conio.h (on windows)...强烈建议使用 getchar() 而不是 getch()原因,conio.h 是特定于 Windows 的,因此不可移植 -
@VSG24:我有一个建议。您可以编辑您的问题以包含一个重现问题的最小示例吗?当前的错误、糟糕的代码似乎让人分心。顺便说一句,
rand()确实有效。 -
如果
qsort无关紧要,您不应该将其包含在您的问题中。最好的问题是那些提供演示问题所需的最少代码量的问题。花更多的时间预先制定一个好问题将节省您的时间和精力。另外,考虑改写问题的标题。 C 正在生成随机数,是你对它们的使用是错误的。 -
另一种想法是使用有意义的变量名称,例如
num_numbers和num_result,这样您就不太可能将维度与数组不匹配