Нас попросили создать библиотеку случайных букв на Java. Я сделал домашнее задание. Нас просят писать на C сейчас. Я сделал это с помощью nanotime в Java. Я провел небольшое исследование и не смог найти нановремя в 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
Но мы не используем функцию rand в домашней работе. Цель состоит в том, чтобы создать нашу собственную библиотеку случайных чисел. Я знаю функцию ранда @ JL2210
Что ж, тогда напишите функцию с аргументом (неважно, что это такое) и пусть эта функция возвращает адрес аргумента по модулю чего-то (например, 257,3).
Разрешение System.nanoTime() зависит от системы, и в некоторых системах вы получите одно и то же значение много раз. примечание: вам нужно 52 символа, поэтому сгенерируйте число от 0 до 51 более эффективно. int rand = rand.nextInt(52); char ch = (char) (rand < 26 ? 'A' + rand : 'a' + rand - 26);




Системный вызов Unix, который вы ищете, это clock_gettime(), который даст вам наносекундное время.
Тем не менее, я предложу некоторые комментарии к вашему коду C, даже если вы не спрашивали: вам лучше попытаться написать код с нуля, а не портировать код Java. Ваша система, вероятно, предлагает вызов random(), который даст вам случайное число гораздо чище, чем ваш подход. Кроме того, вы никогда не должны приводить возврат от malloc(): он возвращает void *. Никогда не разыгрывайте, если можете этого избежать — это очень плохая привычка, которая в конечном итоге только скрывает от вас жуков. Точно так же не приводите y_ms и x_ms к типу double — вы объявили их двойными. Это приведение может только навредить вам, когда вы измените объявление y_ms и x_ms и забудете изменить приведение.
Вы переходите до и после Nano(), что плохо. Это структуры, поэтому вы копируете все данные в структурах в стек. Гораздо лучше передавать указатели на структуры, чтобы вы писали только указатель.
Вам не нужно «переводить» его как таковое... Просто напишите новый на C с помощью
rand()иsrand(). Также, пожалуйста, не удаляйте этот вопрос после того, как узнаете ответ. Это никому не помогает.