Алгоритм случайного числа
В моем проекте используется функция rand() из стандартной библиотеки С. К сожалению, в android-ndk я не нашел подобной функции. Не подскажете алгоритм для ее реализации?
Источник: Stack Overflow на русском
В моем проекте используется функция rand() из стандартной библиотеки С. К сожалению, в android-ndk я не нашел подобной функции. Не подскажете алгоритм для ее реализации?
Что-то у вас там не то. Ну не может быть такого.
cy6ergn0m@cgmachine dist/dev/android-ndk-r5b $ pwd
/home/cy6ergn0m/dist/dev/android-ndk-r5b
cy6ergn0m@cgmachine dist/dev/android-ndk-r5b $ fgrep -rn "int rand(void)" ./platforms/android-9/arch-arm/usr/include
./platforms/android-9/arch-arm/usr/include/stdlib.h:117:static __inline__ int rand(void) {
cy6ergn0m@cgmachine dist/dev/android-ndk-r5b $ fgrep -rn "int rand(void)" ./platforms/android-4/arch-arm/usr/include
./platforms/android-4/arch-arm/usr/include/stdlib.h:116:static __inline__ int rand(void) {
cy6ergn0m@cgmachine dist/dev/android-ndk-r5b $ fgrep -rn "int rand(void)" ./platforms/android-3/arch-arm/usr/include
./platforms/android-3/arch-arm/usr/include/stdlib.h:116:static __inline__ int rand(void) {
Как видно, функция rand на месте, а если открыть файл на 117й строке, то видно, что и все остальные стандартные функции тоже в добром здравии.
UPD Смотрим нативные либы
cy6ergn0m@cgmachine dist/dev/android-ndk-r5b $ ./toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-objdump -d ./platforms/android-4/arch-arm/usr/lib/libc.so | grep ":$" | grep rand
00017498 <__dorand48>:
00017b5c <jrand48>:
00017c08 <lrand48>:
00017c2c <mrand48>:
00017c50 <nrand48>:
000182f8 <srand48>:
0001f304 <_dorand48>:
0001f52c <arc4random_buf>:
0001f5cc <arc4random>:
0001f62c <arc4random_uniform>:
0001f668 <arc4random_stir>:
0001f708 <arc4random_addrandom>:
0001f98c <drand48>:
0001f9ac <erand48>:
00026710 <__res_randomid>:
00027638 <random_bind>:
cy6ergn0m@cgmachine dist/dev/android-ndk-r5b $
Как видно, необходимые функции присутствуют, в том числе lrand48, на которую ссылается rand в заголовочнике (rand - инлайн-функция):
cy6ergn0m@cgmachine dist/dev/android-ndk-r5b $ head -n 130 ./platforms/android-9/arch-arm/usr/include/stdlib.h | tail -n 15
#define RAND_MAX 0x7fffffff
static __inline__ int rand(void) {
return (int)lrand48();
}
static __inline__ void srand(unsigned int __s) {
srand48(__s);
}
static __inline__ long random(void)
{
return lrand48();
}
static __inline__ void srandom(unsigned int __s)
{
srand48(__s);
}
Не должно быть проблем с rand в NDK. Берем пример Hello-JNI из NDK и добавляем туда вызов rand:
#include <string.h>
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )
{
char out[256] = { 0 };
srand ( time(NULL) );
sprintf(out, "Rand is = %d", rand() % 10 + 1);
return (*env)->NewStringUTF(env, out);
}
И проверяем на эмуляторе: