用指针将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函数。

+0

在这个任何更多的细节? – 2013-04-25 03:53:11

+0

对于这一小部分代码,JNI在开发成本和运行时都可能更昂贵。 – 2013-04-25 03:57:34

+0

请参考Wiki的链接来了解JNI的基本知识。 [链接](http://en.wikipedia.org/wiki/Java_Native_Interface) – akhil 2013-04-25 04:02:49

该指针用于使plSeed为inout变量。

由于您已经将randomNumberGenerator放入某个班级,因此您应该将功能参数plSeed提升为该班级的某个字段。

+0

如果plSeed是一个字段,我应该赋予它什么样的价值?从我调用函数开始,第一个函数应该产生一个介于0和1之间的值。 – 2013-04-25 03:54:21

+0

一种选择是根据当前时间初始化种子 - 例如System.currentTimeMillis()。 – 2013-04-25 03:58:56

该指针正在用于更新参数的值。我建议重新组织代码以避免使用这样的参数(并直接访问类变量gv_lRandomNumberSeed)。其余代码可以直接转换成Java(如果您熟悉Java的Random类)。

哦,并且请在您移植时摆脱匈牙利符号。

+0

是的,其余的代码看起来很直截了当。但我不确定“gv_lRandomNumberSeed”的预期输入值应该是多少。这两段代码应该只能插入我编码的Mean值。如果我把“gv_1RandomNumberSeed”作为一个字段,我不确定我应该给它赋予什么样的值。 – 2013-04-25 03:52:48

+0

@GasperGulotta - 我的猜测是PRNG有一些初始化函数用于设置初始值。它可能无关紧要(只要它是一个正值)。请注意,结果将介于0.0和1.0之间,因为2147483647是可能的最大“长”值,而“dZ”严格小于构造。 – 2013-04-25 04:09:21

选项包括:

  • 放置在相同的类作为方法randomNumberGenerator种子作为字段()。
  • 将可变对象参数中的种子传递给randomNumberGenerator()。
  • 返回包含新值和新种子的对象中的种子。

Java的Random类使用第一种方法。这对方法的调用者来说是最简单的。

该指针基本上只是参考参数的C等价物。您可以通过多种方式在Java中实现相同的功能。看一看下面这个问题的答案:

Can I pass parameters by reference in Java?