2010-03-30

Tcl 隨機產生身份證字號

平常都是用 javascript 或 php 檢查身分證號碼,想不到有一天會需要用到身分證號產生器 XD 規則網路上很多,用 tcl 寫也沒幾行。 
proc random_uid {sex} {
  set ret ""
  set wgt 0
  set cityList {A B C D E F G H J K L M N P Q R S T U V X Y W Z I O}
  set city [lpick $cityList]
  append ret $city
  set cityNum [expr [lsearch $cityList $city] + 10]
  set rndNum "$sex[expr {int(rand()*9000000+1000000)}]"
  append ret $rndNum
  set wgt [expr [expr [string index $cityNum 0] * 1] + [expr [string index $cityNum 1] * 9] ]
  set j 8
  for {set i 0} {$i<8} {incr i} {
    set wgt [expr $wgt + [expr [string index $rndNum $i ] * $j]]
    incr j -1
  }
  set chk [expr 10 - ($wgt % 10)]
  if {$chk == 10} {set chk 0}
  append ret $chk
  return $ret
}

3 則留言:

  1. 好像少了lpick :

    proc lpick {L} {lindex $L [expr int(rand()*[llength $L])]}

    -1的動作我比較愛用:

    set j 100001

    puts [time {incr j -1} 10000]
    ;#0.7132 microseconds per iteration

    puts [time {set j [expr $j -1]} 10000]
    ;#5.1285 microseconds per iteration

    expr我也喜歡這樣用:

    set wgt 17

    puts [time {expr 10 - ($wgt % 10) } 10000]
    ;#4.9517 microseconds per iteration

    puts [time {expr 10 - [expr $wgt % 10] } 10000]
    ;#7.6521 microseconds per iteration

    回覆刪除
  2. 還是學長厲害! 馬上改。最近寫個小程式發現很多有趣的事,下次見面再跟你說 XD

    回覆刪除
  3. 沒有比較利害啦!!

    只是寫久了就比較會注意這些 哈哈

    回覆刪除