Случайное число в C - PullRequest
       7

Случайное число в C

0 голосов
/ 08 апреля 2011

Я пишу свой собственный метод для генерации случайного числа с C следующим образом:

int randomNumber(){  
    int catch = *pCOUNTER;  
    int temp = catch;  
    temp /= 10;  
    temp *= 10;  
    return (catch - temp);  
}

pCounter - это, по сути, указатель на регистр в устройстве, которое я использую. Число в этом регистре постоянно увеличивается, поэтому я хочу взять только первую цифру.

В какой-то момент возвращаемое число становится больше 9, и я не уверен, что проблема в моем коде или в самом устройстве. Устройство представляет собой плату Altera DE1.

Может кто-нибудь помочь с этим?

Спасибо!

Ответы [ 6 ]

4 голосов
/ 08 апреля 2011

Вы объявили pCounter летучим?

volatile unsigned *pCounter = (unsigned *)0xBADDECAF;

int randomNumber(){
    return *pCounter % 10;
}
1 голос
/ 08 апреля 2011

Я подозреваю, что вашей проблемой может быть «оптимизация», введенная компилятором - если у вас нет pCOUNTER, объявленного с правильной волатильностью, компилятор может считывать указатель более одного раза.Я понятия не имею, сколько регистров может иметь ваш процессор - если недостаточно для хранения catch в регистре, он может прочитать его несколько раз (один раз, чтобы получить что-то для выполнения вычислений temp, и снова для финальноговозвращаемое значение).

Попробуйте выполнить следующее, что должно гарантировать, что pCOUNTER устройство / регистр считывается ровно один раз:

int randomNumber(){  
    int catch = *(int volatile*)pCOUNTER;  
    int temp = catch;  
    temp /= 10;  
    temp *= 10;  
    return (catch - temp);  
}
1 голос
/ 08 апреля 2011

Чтобы добиться того, что вы пытаетесь сделать в своем коде:

int catch = *pCOUNTER;
return (catch % 10); // Returns only the ones digit

Тем не менее, я задаюсь вопросом, близок ли этот подход к разумной случайности ...

1 голос
/ 08 апреля 2011

Вы уверены, что не хотите использовать% = вместо / = & * =?

0 голосов
/ 08 апреля 2011

Если вы ищете случайную цифру (только 0-9), попробуйте эту модификацию вашего метода.

int randomNumber(){  
    return ((*pCOUNTER) % 10);  
}

Это не очень случайно, хотя. Если оно всегда увеличивается, предположительно с известной скоростью, то оно предсказуемо на 100%, а не случайно.

Разрешена ли функция rand() на этой плате Altera?

Edit:

Вы всегда можете написать свой собственный PRNG. Я сделал поиск в Google по «простому коду генератора случайных чисел» и нашел несколько простых примеров. Самые простые из них:

int randomNumber()
{
    static long a = SomeSeedValue;

    a = (a * SomeNumber + AnotherNumber) % SomeLargePrimeNumber;
    return a % 65536;
}
0 голосов
/ 08 апреля 2011

Если вы хотите произвольно ограничить результат до 9:

return (catch - temp)%10;

Я рекомендую использовать макрос-константу для абстрагирования от '10', иначе это магическое число.

...