zoukankan      html  css  js  c++  java
  • 随机数的算法

    获取相同概率随机数的算法

     

    这几天在做公司年会的一个抽奖软件,开始做的的时候,认为算法是很简单的,把员工的数据放进list里,把list的标号作为需要获取的随机数,根据得到的随机数就确定是谁中奖。后来测试发现,随机数的分布是非常不均匀的。后来才知道,原来计算机获取的随机数都是伪随机数,当抽奖的速度非常快的时候,获取的随机数是非常不均匀的,所以在每次抽奖的时候要添加延时。后来重新设计算法,最终实现了。

    算法原理跟二分查找的过程有点像。一枚硬币抽中正、反面的概率是一样,当抽样的次数无限增多,抽中的概率是50%。

    代码如下:

    复制代码
    public partial class MainWindow : Window
        {
            string s;
            int number;
            public MainWindow()
            {
                InitializeComponent();
            }
            public int getRandom()
            {
                //string[] arr = new string[5] { "我们", "是", "一", "个","团队" };
    
                Random r = new Random();
                int num = 2;
                int choose = r.Next(num);
                return choose;
                //MessageBox.Show(arr[choose].ToString());
            }
            public string GRandom(int n)
            {
                //if()
                if (n == 0)
                {
                    //s = getRandom() + s;
                    //System.Threading.Thread.Sleep(1);
                    return s;
                }
                if (n % 2 == 0)
                {
                    n = n / 2;
    
                }
                else
                {
                    n = (n - 1) / 2;
                    //s = getRandom() + s;
                }
                s = getRandom() + s;
                System.Threading.Thread.Sleep(20);
                GRandom(n);
                //System.Threading.Thread.Sleep(1);
                return s;
            }
            public Int32 Estimate(int n)
            {
                string num = GRandom(n);
                number = Convert.ToInt32(num, 2);
                if (number > n - 1)
                {
                    //num = "";
                    s = "";
                    Estimate(n);
                }
                //else
                return number;
            }
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                for (int i = 0; i < 100; i++)
                {
                    label1.Content += Estimate(200) + ";";
                    s = "";
                }
            }
        }
    复制代码
     
     
    分类: Algorithm

    记一次在StackOverFlow上问问题的经历

     

    最近一直在做测试方面的事情,被测的一些功能需要连接到FTP服务器上。而我在做本地测试时为了方便,就使用java写了一个简单的ftp服务器,可以在命令行下直接启动运行。

    当时在main函数里是这样写的。

    1
    2
    3
    4
    5
    6
    7
    
    public class App {
        public static void main(String[] args) {
            FtpServer ftpServer = new FtpServer();
            ftpServer.start();
        }
    }
    

    然后在命令行运行java -jar ftpserver.jar就可以启动这个FTP服务。一切都很完美。当我想关闭FTP服务时,直接按了Ctrl + C来终止了这个JVM实例。但是我发现ftpserver.jar这个文件删不了了,原因是虽然我终止了该JVM实例,但是FTP服务器并没有被正确的退出。

    那么如何实现在按Ctrl+C终止该JVM实例时,能够让程序调用FtpServer中的stop方法来关闭FTP服务?我想在Google上寻找答案,但是连续换了几个关键词都没找到解决方案。

    这个时候我都有点差点放弃了,心想反正也不是一个很严重的问题。后来想到不如在StackOverFlow上问一下吧。说实话虽然我经常上StackOverFlow,但是很少在上面问问题。

    我在StackOverFlow上发布了这个问题,链接如下。 http://stackoverflow.com/questions/21108059/stop-the-process-when-press-command-c-in-terminal

    过了不到20分钟,就收到了一个回答。

    从上面可以看出,其实我这个问题之前已经有人问过了,并且收到了满意的答案。我根据回答中提供的链接,很快实现了方法。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    public static void main(String[] args) {
            final FtpServer ftpServer = new FtpServer();
            Runtime.getRuntime().addShutdownHook(new Thread() {
                @Override
                public void run() {
                    ftpServer.stop();
                }
            });
            ftpServer.start();
        }
    

    在oracle的官方文档中有对addShutdownHook方法的详细解释。

    通过文档可以看出JVM在两种事件下会响应shutdown:

    1. 程序正常退出,比如最后的非后台线程退出或System.exit方法被调用。

    2. 用户终止了JVM,比如按下Ctrl+C,或者登出或关闭系统。

    某些情况下JVM是不会响应shutdown的,比如直接用kill命令杀死进程。JVM在shutdown时,会自动触发注册的hook线程,并以并行的方式来运行,JVM并不保证这些hook的调用顺序。

    通过这个小事件给了我两个启示:

    1. 当碰到技术困难时,不要轻言放弃,努力找出解决方案。即使找不到完美的解决方案,也要想一些替代方案。

    2. 在StackOverFlow上问问题时不要太着急,先查找下有没有类似的已经解决的问题,这样可以节省时间。

  • 相关阅读:
    bootstrap添加多个模态对话框支持
    突然想写书
    几个常用的内存、CPU飙高 分析工具
    steeltoe学习
    thrift简单使用
    记一次线上Mysql数据库 宕机
    .NetCore 开发生产环境项目前的思考&&踩坑
    SOA(面向服务架构)——踩坑后反思:这样值得吗?
    ProtoBuf与Newtonsoft序列化反序列化性能对比
    SimpleInjector 简单使用
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3528962.html
Copyright © 2011-2022 走看看