Как перевести функцию с Java на C?

Нас попросили создать библиотеку случайных букв на 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

Вам не нужно «переводить» его как таковое... Просто напишите новый на C с помощью rand() и srand(). Также, пожалуйста, не удаляйте этот вопрос после того, как узнаете ответ. Это никому не помогает.

S.S. Anne 14.04.2019 23:20

Но мы не используем функцию rand в домашней работе. Цель состоит в том, чтобы создать нашу собственную библиотеку случайных чисел. Я знаю функцию ранда @ JL2210

Muhammet Ömer 14.04.2019 23:26

Что ж, тогда напишите функцию с аргументом (неважно, что это такое) и пусть эта функция возвращает адрес аргумента по модулю чего-то (например, 257,3).

S.S. Anne 14.04.2019 23:28

Разрешение System.nanoTime() зависит от системы, и в некоторых системах вы получите одно и то же значение много раз. примечание: вам нужно 52 символа, поэтому сгенерируйте число от 0 до 51 более эффективно. int rand = rand.nextInt(52); char ch = (char) (rand < 26 ? 'A' + rand : 'a' + rand - 26);

Peter Lawrey 15.04.2019 00:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Системный вызов Unix, который вы ищете, это clock_gettime(), который даст вам наносекундное время.

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

Вы переходите до и после Nano(), что плохо. Это структуры, поэтому вы копируете все данные в структурах в стек. Гораздо лучше передавать указатели на структуры, чтобы вы писали только указатель.

Другие вопросы по теме