冷算法:自动生成代码标识符(类名、方法名、变量名)

冷算法:自动生成代码标识符(类名、方法名、变量名)

2018-04-26 00:04

竟然有小伙伴喜欢在编写代码时使用随机字符当作类名、方法名、变量名,例如这一篇博客里的代码:使用 Resharper 特性 - 林德熙。既然随机,那也随机得像一些啊!于是我改进了标识符的随机算法,使得生成的标识符更像真实单词的组合。


看看标识符的生成效果吧!0、2、4……行是 PascalCase,即首字母大写的;1、3、5……行是 camelCase 即首字母小写的。

▲ 是不是感觉甚至能读出来?

嗯嗯,因为生成规则中考虑到了辅音和元音的组合,而且……嗯……还考虑到了部件出现的概率。

比如一个单词中的音节数,单音节概率 44%,双音节概率 31%,三音节概率 19%,四音节概率 6%。而这样的概率是通过一个幂函数来实现的。具体来说,是下面这个函数:

好吧,把我的源码放出来:

public class RandomIdentifier
{
    private readonly Random _random = new Random();

    public string Generate(bool pascal)
    {
        var builder = new StringBuilder();
        var wordCount = _random.Next(2, 4);
        for (var i = 0; i < wordCount; i++)
        {
            var syllableCount = 4 - (int) Math.Sqrt(_random.Next(0, 16));
            for (var j = 0; j < syllableCount; j++)
            {
                var consonant = Consonants[_random.Next(Consonants.Count)];
                var vowel = Vowels[_random.Next(Vowels.Count)];
                if ((pascal || i != 0) && j == 0)
                {
                    consonant = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(consonant);
                }

                builder.Append(consonant);
                builder.Append(vowel);
            }
        }

        return builder.ToString();
    }

    private static readonly List<string> Consonants = new List<string>
    {
        "q","w","r","t","y","p","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m",
        "w","r","t","p","s","d","f","g","h","j","k","l","c","b","n","m",
        "r","t","p","s","d","h","j","k","l","c","b","n","m",
        "r","t","s","j","c","n","m",
        "tr","dr","ch","wh","st",
        "s","s"
    };

    private static readonly List<string> Vowels = new List<string>
    {
        "a","e","i","o","u",
        "a","e","i","o","u",
        "a","e","i",
        "a","e",
        "e",
        "ar","as","ai","air","ay","al","all","aw",
        "ee","ea","ear","em","er","el","ere",
        "is","ir",
        "ou","or","oo","ou","ow",
        "ur"
    };
}

而使用方法,则是简单的一个调用:

var identifier = new RandomIdentifier();
var pascal = _identifier.Generate(true);
var camel = _identifier.Generate(false);

传入 true 生成首字母大写的版本,传入 false 生成首字母小写的版本。

本文会经常更新,请阅读原文: https://walterlv.com/post/algorithm-of-generating-random-identifiers.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据风控

R中重复值、缺失值及空格值的处理

1、R中重复值的处理 unique函数作用:把数据结构中,行相同的数据去除。 #导入CSV数据 data <- read.csv('1.csv', fileEn...

34310
来自专栏机器之心

业界 | 谷歌开源DeepLearn.js:可实现硬件加速的机器学习JavaScript库

选自GitHub 机器之心编译 参与:蒋思源、路雪 deeplearn.js 是一个可用于机器智能并加速 WebGL 的开源 JavaScript 库。de...

3818
来自专栏数说工作室

统计师的Python日记【第5天:Pandas,露两手】

本文是【统计师的Python日记】第5天的日记 回顾一下: 第1天学习了Python的基本页面、操作,以及几种主要的容器类型; 第2天学习了python的函数、...

4727
来自专栏聊聊技术

原 "二分查找(Binary Search

43011
来自专栏编程

数控宏程序的编程及应用

1. 什么场合会用到宏程序编程? 其实说起来宏就是用公式来加工零件,比如说椭圆,如果没有宏的话,我们要逐点算出曲线上的点,然后慢慢来用直线逼近,如果是个光洁度要...

2008
来自专栏小樱的经验随笔

Codeforces 626F Group Projects(滚动数组+差分dp)

F. Group Projects time limit per test:2 seconds memory limit per test:256 megaby...

3527
来自专栏灯塔大数据

每周学点大数据 | No.33最大独立集

No.33期 最大独立集 Mr. 王:好,现在我们来谈谈最大独立集的问题。首先求解最大独立集是一个NP-hard问题,接下来要介绍的这个求解方法是一个近...

3967
来自专栏用户2442861的专栏

阿里巴巴2014秋季校园招聘-软件研发工程师笔试题详解

http://blog.csdn.net/zs634134578/article/details/21018845

1432
来自专栏人工智能LeadAI

TensorFlow应用实战 | TensorFlow基础知识

hw = tf.constant("Hello World! Mtianyan love TensorFlow!")

1724
来自专栏数据结构与算法

HDU4352 XHXJ's LIS(LIS 状压)

刚开始的思路是$f[i][j]$表示到第$i$位,LIS长度为$j$的方案。 然而发现根本不能转移,除非知道了之前的状态然后重新dp一遍。。

953

扫码关注云+社区

领取腾讯云代金券