美文网首页算法第四版习题讲解
算法练习(13):随机连接(1.1.31)

算法练习(13):随机连接(1.1.31)

作者: kyson老师 | 来源:发表于2017-09-06 17:32 被阅读264次

本系列博客习题来自《算法(第四版)》,算是本人的读书笔记,如果有人在读这本书的,欢迎大家多多交流。为了方便讨论,本人新建了一个微信群(算法交流),想要加入的,请添加我的微信号:zhujinhui207407 谢谢。另外,本人的个人博客 http://www.kyson.cn 也在不停的更新中,欢迎一起讨论

算法(第4版)

知识点

  • 绘点
  • 随机函数

题目

1.1.31 随机连接。编写一段程序,从命令行接受一个整数 N 和 double 值 p(0 到 1 之间)作为参数, 在一个圆上画出大小为 0.05 且间距相等的 N 个点,然后将每对点按照概率 p 用灰线连接。


1.1.31 Random connections. Write a program that takes as command-line arguments an integer N and a double value p (between 0 and 1), plots N equally spaced dots of size .05 on the circumference of a circle, and then, with probability p for each pair of points, draws a gray line connecting them.

分析

这道题考察了Random库和StdDraw库的使用

Random的方法的使用
StdRandom.uniform()方法生成0到1之间的数;
StdDraw.point(0.5, 0.5)方法可以生成居中的点
举例,代码

//设置画笔颜色
StdDraw.setPenColor(StdDraw.RED);
//设置画笔的大小
StdDraw.setPenRadius(0.5);
//画个点
StdDraw.point(0.5, 0.5);

的效果如下


这也从侧面印证,不设置X轴和Y轴的话,默认的X轴Y轴大小是1个单位。

接着我们继续分析题目,首先我们要画个圆,画圆的方法是
public static void circle(double x, double y, double radius)
举例,我们通过如下代码一个半径为0.5的圆
StdDraw.circle(0.5, 0.5, 0.5);
如图:

解决了这个画圆,画点的问题后,我们开始着手找这道题的解题思路,首先,我们要在圆上画点,而且这些点需要满足距离相等,那假设要画N个点,点与点之间的角度为360/N。

Point[] points = new Point[N];      
for (int i = 0; i < N; i++)
{
    points[i] = new Point(0.5 + 0.5 * Math.cos(angle * i * Math.PI / 180),
            0.5 + 0.5 * Math.sin(angle * i * Math.PI / 180));
    StdDraw.point(points[i].x, points[i].y);
}

这样就画出了这N个点。

答案

public class RandomConnectSample {
    
    static class Point {
        double x;
        double y;
        public Point(double x, double y) {
            super();
            this.x = x;
            this.y = y;
        }
    }

    public static void main(String[] args) {
        int N = 10;
        double p =  StdRandom.uniform();

        //算出角度
        double angle = 360.0 / N;
        StdDraw.circle(0.5, 0.5, 0.5);
        
        Point[] points = new Point[N];      
        for (int i = 0; i < N; i++)
        {
            points[i] = new Point(0.5 + 0.5 * Math.cos(angle * i * Math.PI / 180),
                    0.5 + 0.5 * Math.sin(angle * i * Math.PI / 180));
            StdDraw.point(points[i].x, points[i].y);
        }
        
        StdDraw.setPenColor(StdDraw.GRAY);

        for (int i = 0; i < N - 1; i++) 
        {
            for (int j = i + 1; j < N; j++)
            {
                if (StdRandom.bernoulli(p))
                {
                    StdDraw.line(points[i].x, points[i].y, points[j].x, points[j].y);
                }
            }
        }
        
    }

}

代码索引

RandomConnectSample.java

广告

我的首款个人开发的APP壁纸宝贝上线了,欢迎大家下载。

相关文章

  • 算法练习(13):随机连接(1.1.31)

    本系列博客习题来自《算法(第四版)》,算是本人的读书笔记,如果有人在读这本书的,欢迎大家多多交流。为了方便讨论,本...

  • loadBalance 的负载均衡解释

    负载均衡解释?客户端通过负载均衡算法,从服务列表中选择服务地址,进行连接的过程,负载均衡算法有, 轮询、随机、加权...

  • 多层神经网络,从零开始——(九)、优化函数

    常用的优化算法有:随机梯度下降、带动量的随机梯度下降、AdaGrad算法、RMSProp算法、Adam算法,其中A...

  • 算法练习(102): 随机链接(1.5.17)

    本系列博客习题来自《算法(第四版)》,算是本人的读书笔记,如果有人在读这本书的,欢迎大家多多交流。为了方便讨论,本...

  • 算法练习(41): 随机背包(1.3.34)

    本系列博客习题来自《算法(第四版)》,算是本人的读书笔记,如果有人在读这本书的,欢迎大家多多交流。为了方便讨论,本...

  • 集成学习之Bagging和RF

    一、什么是随机森林 二、随机森林的两个随机 三、随机森林算法过程 四、为什么如此受欢迎 五、随机森林算法的优缺点 ...

  • 对https握手过程的理解

    一:https握手大致过程 建立服务器443端口连接 SSL握手:随机数,证书,密钥,加密算法 发送加密请求 发送...

  • 三种迷宫生成算法概述

    1. Randomized Prim's algorithm(随机Prim算法) 随机Prim算法属于打通墙壁生成...

  • 负载均衡算法

    RandomLoadBalance(随机算法),RoundRobinLoadBalance(轮询算法),Least...

  • 概率分析与随机算法

    目录 0.雇佣问题 1.概率分析的含义 2.随机算法 3.随机算法与概率分析的区别 4.雇佣问题的随机算法4.1 ...

本文标题:算法练习(13):随机连接(1.1.31)

本文链接:https://www.haomeiwen.com/subject/spuujxtx.html