随笔 - 341  文章 - 8 评论 - 499 trackbacks - 19
<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

公告:发表时间超过两个月的随笔的源码一般都被删除了,请勿留言索取。

昵称:天方
园龄:6年2个月
粉丝:27
关注:1

搜索

 
 

常用链接

最新随笔

随笔分类

随笔档案

文章分类

.net学习

最新评论

阅读排行榜

评论排行榜

推荐排行榜

常见的翻译服务提供商有Google和微软,它们的在线翻译地址如下:

Bing和Google除了提供在线翻译外,也提供了一系列API,方便开发者制作自己的翻译工具。不过貌似Google翻译收费了,这里就介绍一下如何利用Bing翻译API简单的实现一个翻译工具。

要使用Bing翻译的API,首先则必须到http://cn.bing.com/developers/createapp.aspx里注册一个APPID,注册的过程比较简单,这里就不说了。

Bing翻译API提供了如下三种方式的接口:AJAX 接口SOAP 接口HTTP 接口。如果打算自己做个独立程序的用途来说,使用SOAP接口是非常方便的。

posted @ 2012-02-12 11:50 天方 阅读(13) 评论(0) 编辑

以前庙会上经常有一个这样的游戏:

摆摊人拿出四种不同颜色的球,每种5个,然后放在一个袋子里,让观众摸出十个来,然后按颜色分类,统计每种颜色的个数,根据不同组合可以拿到不同的奖品,但如果是1234或3322这两种组合的时候,则需要给摆摊人几块钱。

其实一看到这个游戏就大致猜到这是个概率游戏了,1234和3322绝对是该规则下出现的较大的两个概率,摆摊人则无需使用任何作弊手段。但这两种组合的概率是多大,到一直没有细考虑过。其实上学的时候尝试算过,但当时数学没学好,愣是没算出来,便很快放弃了,现在上几年班后就自然更算不出来了。今天编了个小程序简单的算了个粗略的结果:

程序如下:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             var query = from i in Enumerable.Range(0100 * 10000)
 6                         let result = Test()
 7                         group result by result into g
 8                         let value = new { Result = g.Key.ToString("0000"), Count = (double)g.Count() / 10000 }
 9                         orderby value.Count descending
10                         select value;
11 
12             foreach (var item in query)
13             {
14                 Console.WriteLine(item);
15             }
16         }
17 
18         static Random rnd = new Random();
19         static int Test()
20         {
21             var numbers = Enumerable.Range(020).OrderBy(_ => rnd.Next()).Take(10);    //随机抽取十个
22 
23             var query = from n in numbers        //统计每种花色的张数
24                         let color = n % 4
25                         let value = n / 4
26                         group value by color into g
27                         select g.Count();
28 
29             return query.OrderBy(i => i).Aggregate(0, (value, i) => value * 10 + i);
30         }
31     }

该程序的输出结果如下:

 { Result = 2233, Count = 32.5512 }
 { Result = 1234, Count = 32.4215 }
 { Result = 1333, Count = 10.8416 }
 { Result = 2224, Count = 10.766 }
 { Result = 1225, Count = 3.2447 }
 { Result = 0334, Count = 3.2204 }
 { Result = 1144, Count = 2.0338 }
 { Result = 0244, Count = 1.6388 }
 { Result = 1135, Count = 1.6385 }
 { Result = 0235, Count = 1.3121 }
 { Result = 0145, Count = 0.3284 }
 { Result = 0055, Count = 0.003 }

也就是说,3322和1234这两种组合将近占了65%,只要摆摊人把1333和2224这两种组合设置为比较小的奖项,基本上就稳赚不赔了,而最大奖0055,只有0.003%的概率,确实很难一见。

 

posted @ 2012-02-06 23:13 天方 阅读(23) 评论(0) 编辑
摘要: 最近发现手机的时间不是很准了,便到网上下了一个同步时间的小程序,简单了看了一下它的原理,是通过NTP协议来实现校时的,就顺便学习了一下NTP协议,用C#写了个简单的实现。 NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步。阅读全文
posted @ 2011-12-20 13:29 天方 阅读(89) 评论(0) 编辑

猜数字的算法的一个简单实现,用的最简单的算法,权当编程练习。

 1     class GuessNumber
 2     {
 3         public static IEnumerable<int> Guess(Func<intint> testHanlder)
 4         {
 5             var validNumers = Enumerable.Range(19);    //有效数字范围为1-9
 6             var candicateNum = from n1 in validNumers
 7                                from n2 in validNumers
 8                                from n3 in validNumers
 9                                from n4 in validNumers
10                                where new int[] { n1, n2, n3, n4 }.Distinct().Count() == 4    //过滤掉有重复的数字
11                                select n1 * 1000 + n2 * 100 + n3 * 10 + n4;
12 
13             while (true)
14             {
15                 var num = candicateNum.First();
16                 yield return num;
17 
18                 var result = testHanlder(num);
19                 if (result == 40)
20                     yield break;
21 
22                 candicateNum = candicateNum.Where(i => Test(i, num) == result);
23             }
24         }
25 
26         public static IEnumerable<int> Guess(int num)
27         {
28             return Guess(i => Test(i, num));
29         }
30         
31         //为了简单返回值为int型,如2A1B则返回21
32         public static int Test(int num1, int num2)
33         {
34             var value1 = num1.ToString("0000");
35             var value2 = num2.ToString("0000");
36 
37             Contract.Assume((value1.Length == 4) && (value2.Length == 4));
38 
39             var query = value1.Zip(value2, (ch1, ch2) => new 
40                                     {
41                                         MatchA = (ch1 == ch2),
42                                         MatchB = (ch1 != ch2) && (value1.Contains(ch2))
43                                     }).ToArray();
44 
45             var aCount = query.Count(i => i.MatchA);
46             var bCount = query.Count(i => i.MatchB);
47 
48             return aCount * 10 + bCount;
49         }
50     }

 

posted @ 2011-10-30 21:25 天方 阅读(93) 评论(0) 编辑

当我们使用.net 4.0中的任务并行库的时候,有时候我们是需要自己控制并发粒度(调度线程数)的,这个时候往往就需要我们自己写TaskScheduler了,一个简单的实现如下:

View Code
public sealed class SimpleTaskScheduler : TaskScheduler, IDisposable
{
    BlockingCollection<Task> _tasks = new BlockingCollection<Task>();
    List<Thread> _threads = new List<Thread>();

    public SimpleTaskScheduler(int initNumberOfThreads = 3)
    {
        if (initNumberOfThreads < 1)
            throw new ArgumentOutOfRangeException();

        _threads.AddRange(Enumerable.Range(0, initNumberOfThreads).Select(_ => CreateThread()));
    }

    Thread CreateThread()
    {
        var thread = new Thread(() =>
        {
            foreach (var t in _tasks.GetConsumingEnumerable())
            {
                TryExecuteTask(t);
            }
        });

        thread.IsBackground = true;
        thread.Start();
        return thread;
    }

    protected override IEnumerable<Task> GetScheduledTasks()
    {
        //这个函数好像没有调过,返回null也不影响功能
        return _tasks.ToArray();
    }

    protected override void QueueTask(Task task)
    {
        _tasks.Add(task);
    }

    protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
    {
        return TryExecuteTask(task);
    }

    public override int MaximumConcurrencyLevel { get { return _threads.Count; } }

    #region IDisposable 成员

    public void Dispose()
    {
        if (_tasks == null)        //防止重入
            return;

        _tasks.CompleteAdding();
        _threads.ForEach(t => t.Join());

        _tasks.Dispose();
        _tasks = null;
    }

    #endregion
}

 

这个类实现并不复杂,但其实用得还是比较多的,这里记录一下,以备后续查询。

PS:当前在Parallel.ForEachParallel.For等数据并发函数中可以通过ParallelOptions.MaxDegreeOfParallelism来控制并发粒度,但无法控制调度顺序。也可以通过类似这样的TaskScheduler来改变调度顺序。

 

posted @ 2011-10-05 18:47 天方 阅读(117) 评论(0) 编辑
摘要: 今天用WPF的WebBrowser控件的时候,发现其竟然没有ScriptErrorsSuppressed属性,导致其到处乱弹脚本错误的对话框,在MSDN上找到了如下解决方案:1staticvoidSuppressScriptErrors(WebBrowserwebBrowser,boolhide)2{3webBrowser.Navigating+=(s,e)=>4{5varfiComWebBrowser=typeof(WebBrowser).GetField("_axIWebBrowser2",System.Reflection.BindingFlags.Instan阅读全文
posted @ 2011-09-25 15:02 天方 阅读(99) 评论(0) 编辑
摘要: 今天把我以前做的一个程序升级到了.NET 4.0的版本,里面有一段通过HttpWebRequest获取html的代码,第一次运行特别慢,后续运行就快了。在网上搜了一下,在http://blog.csdn.net/rrrfff/article/details/6170653中找到了原因:.NET4.0中的默认代理是开启的,使用默认代理时,只有等待超时后才会绕过代理,从而导致第一次连接特别慢。(不知道微软为什么要把这个打开)该文章中也提到了解决方案,一般有两种:1. 在配置文件中(.config)中添加相应配置,关闭默认代理:1<?xmlversion="1.0"?>阅读全文
posted @ 2011-09-18 22:41 天方 阅读(155) 评论(0) 编辑
摘要: Visual Studio 11 开发者预览版可以下载了,下载地址为:点击下载,提供的是旗舰版,目前支持中文和日文。在虚拟机里装上去试了一下,界面上有少许微调,.net版本是4.5,新增特性比较少,除了支持async关键字外,没有什么太大亮点,而async前在visual studio 2010中也是能支持的。至于metro界面程序,官方说是支持的,但我却没有找到相关的工程模板,不知是否得在win8里面安装才有这个功能。详细信息在在MSDN上也有专栏介绍——Visual Studio 11 Developer Preview。感兴趣的可以看一下。总之这个版本没有什么大的亮点,感觉这个不是下一代阅读全文
posted @ 2011-09-17 17:51 天方 阅读(200) 评论(0) 编辑
摘要: 在面向对象语言中,我们往往通过继承来实现代码的复用,下面代码就演示了一个简单的Log功能的例子: class Logger<T> { Subject<T> subject = new Subject<T>(); public void LogMessage(T msg) { subject.OnNext(msg); } public void Subscribe(Action<T> msgHanlder) { subject.Subscribe(msgHanlder); } } class MyClass1:Logger<string>阅读全文
posted @ 2011-09-16 20:42 天方 阅读(118) 评论(0) 编辑
摘要: shuffle算法一般也被称为洗牌算法,主要功能是将数组里的元素随机打乱,在扑克游戏及mp3播放器中比较常见。在C++的STL库中有专门的函数random_shuffle,在.net中就需要自己写了。不过这个算法并不复杂,一种常规写法如下: static Random rnd = new Random(); public static IEnumerable<T> Shuffle<T>(IEnumerable<T> source) { var elements = source.ToArray(); for (int i = elements.Length 阅读全文
posted @ 2011-09-12 18:58 天方 阅读(116) 评论(0) 编辑