对 lambda 表达式的随机搜索
Stochastic Search to lambda expression
感谢您的帮助和分享。
我的问题是关于随机搜索的。该技术用于通过定义数量的圆环对一般数学计算进行数据近似。请看下面的代码,我试着把它减少到最低限度。我的期望是将此代码设置为 lambda 表达式,for 循环,我希望它具有最佳性能。我有一些意图,但我不确定我是否充分利用了它。
package stochasticsearch;
import java.util.Random;
public class StochasticSearch {
public static double f(double x) {
return -(x - 1) * (x - 1) + 2;
}
public static void main(String[] args) {
final Random random = new Random();
double startPointX = 0;
double max = f(startPointX);
long begin = System.currentTimeMillis();
for (int i = 0; i < 1000000000; i++) {
double index = 2 * random.nextDouble();
if (f(index) > max) {
max = f(index);
}
}
System.out.println("Elapsed time: " + (System.currentTimeMillis() - begin));
System.out.println("Maximum value y=f(x) is " + max);
}
}
谢谢,祝你有愉快的一天。
你的代码在我的系统上用了不到 23 秒就完成了,我可以修改它,让它用时不到 2 秒。这是我的发现:
- 当您可以使用
ThreadLocalRandom
时,您却使用了 Random
;此开关导致相对较大的加速。
- 在某些情况下,您在 for 循环中计算
f(index)
两次,而每次迭代只应计算一次。
- 因为您要遍历大范围的值,所以您可以改用并行流;这也会导致相对较大的加速。
您要将 2
添加到 f
中的每个结果,因此最好在计算 max
后一次性添加它。
public static double f(double x) {
double y = x - 1;
return -y * y;
}
public static void main(String[] args) {
final ThreadLocalRandom random = ThreadLocalRandom.current();
long begin = System.currentTimeMillis();
double max = IntStream.range(0, 1_000_000_000)
.parallel()
.mapToDouble(i -> f(random.nextDouble() * 2))
.max()
.orElse(f(0)) + 2;
System.out.println("Elapsed time: " + (System.currentTimeMillis() - begin));
System.out.println("Maximum value y=f(x) is " + max);
}
感谢您的帮助和分享。
我的问题是关于随机搜索的。该技术用于通过定义数量的圆环对一般数学计算进行数据近似。请看下面的代码,我试着把它减少到最低限度。我的期望是将此代码设置为 lambda 表达式,for 循环,我希望它具有最佳性能。我有一些意图,但我不确定我是否充分利用了它。
package stochasticsearch;
import java.util.Random;
public class StochasticSearch {
public static double f(double x) {
return -(x - 1) * (x - 1) + 2;
}
public static void main(String[] args) {
final Random random = new Random();
double startPointX = 0;
double max = f(startPointX);
long begin = System.currentTimeMillis();
for (int i = 0; i < 1000000000; i++) {
double index = 2 * random.nextDouble();
if (f(index) > max) {
max = f(index);
}
}
System.out.println("Elapsed time: " + (System.currentTimeMillis() - begin));
System.out.println("Maximum value y=f(x) is " + max);
}
}
谢谢,祝你有愉快的一天。
你的代码在我的系统上用了不到 23 秒就完成了,我可以修改它,让它用时不到 2 秒。这是我的发现:
- 当您可以使用
ThreadLocalRandom
时,您却使用了Random
;此开关导致相对较大的加速。 - 在某些情况下,您在 for 循环中计算
f(index)
两次,而每次迭代只应计算一次。 - 因为您要遍历大范围的值,所以您可以改用并行流;这也会导致相对较大的加速。
您要将
2
添加到f
中的每个结果,因此最好在计算max
后一次性添加它。public static double f(double x) { double y = x - 1; return -y * y; } public static void main(String[] args) { final ThreadLocalRandom random = ThreadLocalRandom.current(); long begin = System.currentTimeMillis(); double max = IntStream.range(0, 1_000_000_000) .parallel() .mapToDouble(i -> f(random.nextDouble() * 2)) .max() .orElse(f(0)) + 2; System.out.println("Elapsed time: " + (System.currentTimeMillis() - begin)); System.out.println("Maximum value y=f(x) is " + max); }