2011年8月23日 星期二

樂透號碼產生器

所謂樂透號碼,就是從某範圍整數中,隨機且不重複的選取其中幾個。例如台灣的今彩就是從1到39當中選5個。要從電腦隨機產生一組號碼,比較基本的有以下兩種

1.每個號碼隨機選號,選重複的再去掉。但是這方法很笨,而且選號一多就會慢到不行。

2.模仿開彩方式,按照正確機率依序選擇號碼。以今彩為例,抽中39號的機率是5/39,下一步驟抽中38號的機率就變成5/38(上步驟未抽中39號)或4/38(上步驟抽中39號),依此類推。

第二個方式顯然快多了。下面awk程式(lottery.awk)實現此作法

在類似unix系統環境下,實行

echo "1 39 5" | awk -f lottery.awk

或是perl:
#!/usr/bin/perl
$min=$ARGV[0];
$max=$ARGV[1];
$needed=$ARGV[2];
$available=$max-$min+1;
while (@selected < $ARGV[2]) {
if(rand() < $needed/$available) {
push(@selected, $available);
$needed -= 1;
}
$available -= 1;
}
foreach $number (@selected) {
print($number . "\n");
}


執行
$./lottery.pl 1 39 5

會印出1~39隨機取5個的數字

2011年8月16日 星期二

程式研究:akka的remote actor

akka的remote actor 是個神奇的東西,自動幫你處理了傳輸格式,你只要關心scala當中跟actor互傳的信息就好了。不過要讓akka 首頁上那段非常簡短的程式碼跑起來,需要不少準備。

首先是sbt,這是scala用的build tool,設定檔完全用scala語法表達,簡單方便。
執行sbt只需要一個jar檔和一個script,windows是bat檔,linux是shell script,設好了之後任意目錄下
執行sbt,回答問題之後就會自動產生目錄架構,之後就可以開始寫設定檔和程式了。
設定檔都在project目錄下,源代碼在src目錄下
project/build 之下,建立一個Project.scala,內容如下:
import sbt._
class ChatProject(info: ProjectInfo) extends DefaultProject(info) with AkkaProject {
val akkaRepo = "Akka Repo" at "http://akka.io/repository"
val akkaSTM = akkaModule("stm")
val akkaRemote = akkaModule("remote")
}


project/plugins 之下,建立一個Plugins.scala,內容如下
import sbt._
class Plugins(info: ProjectInfo) extends PluginDefinition(info) {
val akkaRepo = "Akka Repo" at "http://akka.io/repository"
val akkaPlugin = "se.scalablesolutions.akka" % "akka-sbt-plugin" % "1.1.3"
}


之後在sbt下,執行reload和update,就會按照上述的設定抓好必要的檔案並決定從屬關係
之後執行console,可以在此環境下直接執行scala的類似直譯器。

打開第二個command prompt視窗,在工作目錄下再運行一個sbt,此視窗當作client用,第一個視窗當作server,兩個視窗都執行console
server視窗輸入
import akka.actor.Actor
import Actor._
class HelloActor extends Actor {
def receive = {
case "Hello" => self.reply("world")
}
}
remote.start("localhost", 9999)
remote.register("hello-service",actorOf[HelloActor])


client視窗輸入
import akka.actor.Actor
import Actor._
val actor = remote.actorFor("hello-service", "localhost", 9999)
val result = actor !! "Hello"


這樣就收到了server傳來的訊息了。把server當成一個actor用 akka 1.1.3的文件

2011年8月2日 星期二

程式語言研究:scala 1.9

半年前發覺一個有趣的語言scala,它企圖結合編譯式和直譯式語言,以及物件導向和函數導向語言的優點,形成一套有趣卻眉角很多的程式語言,不管怎樣比java好很多是真的,但是發覺缺點主要有兩個,第一是型別參數,因為型別可以不固定,但是卻必須遵從某種形式,第二是仍然擺脫不了java,光靠scala自己仍是不足,經常必須要去用到java的物件或函數。換句話說就是只學了scala仍然不夠,還是得學java,變成想要用scala的話得學兩種語言,相當麻煩。

1.9版新增功能中最有趣的還是maxBy, minBy, permutations 和 combinations這幾個在collection中的方法,後面兩個組合學的函數還是遵從辭典式排列的,不過一般這種函數輸出都會照辭典式排列就是。

scala自帶的actor其實還不夠好用,配合akka服用會愉快許多。