用指针将C++代码转换为Java等效代码
因此,我试图将这些代码转换为在我的Java程序中使用。但是,它有一个指针,我不确定将其转换为Java的最佳方式是什么。用指针将C++代码转换为Java等效代码
/**
* 32-bit Multiplicative Congruential Pseudo Random Number Generator
* Microsoft Visual C++ Version
*/
#include <math.h>
/**
* The seed used by randomNumberGenerator.
*/
long gv_lRandomNumberSeed;
/**
* Returns a random number between 0.0 and 1.0.
* plSeed - Pointer to the seed value to use.
*/
double randomNumberGenerator(long* plSeed) {
double dZ;
double dQuot;
long lQuot;
dZ = (*plSeed) * 16807;
dQuot = dZ/2147483647;
lQuot = (long) floor(dQuot);
dZ -= lQuot * 2147483647;
(*plSeed) = (long) floor(dZ);
return (dZ/2147483647);
}
我需要能够使用这个函数返回上面的号码:
/**
* Returns a random variate from an exponential probability
* distribution with the given mean value of dMean.
*/
double exponentialRVG(double dMean) {
return (-dMean * log(randomNumberGenerator(&gv_lRandomNumberSeed
)));
}
并能够输入DMEAN值和得到的回报值..
任何帮助?
(我知道有很多人上火有关本网站发布的不良问题,请试着从负面不要帮我要问的问题更好,如果是这样的话)
使用JNI(Java的本地接口)技术。使用JNI,您可以从java调用C函数。
该指针用于使plSeed
为inout变量。
由于您已经将randomNumberGenerator
放入某个班级,因此您应该将功能参数plSeed
提升为该班级的某个字段。
如果plSeed是一个字段,我应该赋予它什么样的价值?从我调用函数开始,第一个函数应该产生一个介于0和1之间的值。 – 2013-04-25 03:54:21
一种选择是根据当前时间初始化种子 - 例如System.currentTimeMillis()。 – 2013-04-25 03:58:56
该指针正在用于更新参数的值。我建议重新组织代码以避免使用这样的参数(并直接访问类变量gv_lRandomNumberSeed
)。其余代码可以直接转换成Java(如果您熟悉Java的Random
类)。
哦,并且请在您移植时摆脱匈牙利符号。
是的,其余的代码看起来很直截了当。但我不确定“gv_lRandomNumberSeed”的预期输入值应该是多少。这两段代码应该只能插入我编码的Mean值。如果我把“gv_1RandomNumberSeed”作为一个字段,我不确定我应该给它赋予什么样的值。 – 2013-04-25 03:52:48
@GasperGulotta - 我的猜测是PRNG有一些初始化函数用于设置初始值。它可能无关紧要(只要它是一个正值)。请注意,结果将介于0.0和1.0之间,因为2147483647是可能的最大“长”值,而“dZ”严格小于构造。 – 2013-04-25 04:09:21
选项包括:
- 放置在相同的类作为方法randomNumberGenerator种子作为字段()。
- 将可变对象参数中的种子传递给randomNumberGenerator()。
- 返回包含新值和新种子的对象中的种子。
Java的Random类使用第一种方法。这对方法的调用者来说是最简单的。
该指针基本上只是参考参数的C等价物。您可以通过多种方式在Java中实现相同的功能。看一看下面这个问题的答案:
在这个任何更多的细节? – 2013-04-25 03:53:11
对于这一小部分代码,JNI在开发成本和运行时都可能更昂贵。 – 2013-04-25 03:57:34
请参考Wiki的链接来了解JNI的基本知识。 [链接](http://en.wikipedia.org/wiki/Java_Native_Interface) – akhil 2013-04-25 04:02:49