我们被要求用Java构建一个随机字母库。我做了作业。现在要求我们用C编写。我在Java中使用nanotime做到了。我做了一些研究,但在C语言中找不到纳米时间。
已经在C语言中尝试过:(无效)
Random SayiOlustur(){
Random this;
this = (Random) malloc(sizeof(struct RANDOM));
char randomly;
int i;
struct timeval before , after;
gettimeofday(&before , NULL);
for (i=1 ; i <= 100 ; i++){
printf("%d %d %d ",i, i*i, i*i*i);}
gettimeofday(&after , NULL);
printf("%d",Nano(before,after));
int random;
double test;
while(true){
test = Nano(before,after);
random = (int)test % (int)123.0;
if((random >= 65 && random <= 90) || (random >= 97 && random <= 122)){
randomly = (char) random;
break;
}}}
int Nano(struct timeval x,struct timeval y){
double x_ms , y_ms , diff;
x_ms = (double)x.tv_sec*1000000 + (double)x.tv_usec;
y_ms = (double)y.tv_sec*1000000 + (double)y.tv_usec;
diff = (double)y_ms - (double)x_ms;
return diff;
}
Java代码:(有效)
private long Now(){
long now = System.nanoTime();
return now;
}
public char Random(){
char rastgele;
while(true){
random = (int)((Now())%123);
// ASCI
if((random >= 65 && random <= 90) || (random >= 97 && random <= 122))
break;
}
rastgele = (char) random;
return rastgele;
}
public static void main(String[] args) {
RastgeleKarakter rastgele = new RastgeleKarakter();
System.out.println("Rastgele Karakter: " + rastgele.Random());
}
出局:
run:
Rastgele Karakter: m \\ Random
出局:
run
Rastgele Karakter: y \\ Random
答案 0 :(得分:1)
您要查找的Unix系统调用是clock_gettime(),它将为您提供纳秒级的时间。
也就是说,即使您没有提出要求,我也会对您的C代码提供一些注释:最好从头开始编写代码,而不是移植Java代码。您的系统可能会提供random()调用,这将为您提供比您的方法干净得多的随机数。同样,您永远都不应转换malloc()的返回值:它返回void *。如果可以避免,切勿抛弃-这是一个非常不好的习惯,只会最终向您隐藏错误。同样,请勿将y_ms和x_ms强制转换为double,而应将它们声明为double。仅当您更改y_ms和x_ms的声明而忘记更改演员表时,该演员表才会伤害您。
您在Nano()之前和之后传递,这很糟糕。这些是结构,因此您要将结构中的所有数据复制到堆栈上。将指针传递给结构要好得多,这样您只需编写一个指针即可。