MTで乱数を発生させる(ダイジェスト)
色んな方法がある。大きく分けると3種類。
乱数を用いる用途としては、色々考えられる。MTのデフォルトにはその機能がない。
JavaScriptを用いる
JavaScriptで乱数を得るときは以下のようなコードでいい。
ただしサーバーサイドでなんかの処理(テンプレートの処理分岐など)を行いたい場合には、使えない場合が多い。使途は狭いか?
MT4.1で乱数を取得したい場合<MTSetVarBlock name="RndValue">
<SCRIPT language="JavaScript">
<!--
document.write(Math.floor(Math.random() * 10));
//-->
</SCRIPT>
</MTSetVarBlock>
<MTGetVar name="RndValue">
プラグインを用いる
個人的にはこれが一番使いやすいと思う。再構築を行うとき、ひとつひとつ違う値が得られるわけだ。以下はプラグインのコード。
MT4:MTの変数演算をプラグインで拡張package MT::Plugin::CalcExp;
use strict;
use MT;
use MT::Plugin;
use base qw(MT::Plugin);
use POSIX;
my $plugin = new MT::Plugin::CalcExp({
id => "CalcExp",
key => "CalcExp",
name => "CalcExp",
version => '0.1',
description => "<__trans phrase=\"The Calculation Value(Expand) \">",
author_name => "apstar",
author_link => "http://www.mtde.info/",
});
MT->add_plugin($plugin);
sub init_registry {
my $plugin = shift;
$plugin->registry({
'tags' => {
'function' => {
'CalcExp' => \&_hdlr_getvalue,
},
},
});
}
sub _hdlr_getvalue {
my($ctx, $args) = @_;
my $op = $args->{op};
my $base = $args->{base};
my $palam = $args->{palam};
use constant PI => 3.14159265358979;
if (('+' eq $op) || ('add' eq $op)) {
return $base + $palam if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
elsif (('-' eq $op) || ('sub' eq $op)) {
return $base - $palam if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
elsif (('*' eq $op) || ('mul' eq $op)) {
return $base * $palam if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
elsif (('/' eq $op) || ('div' eq $op)) {
return $base / $palam if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
elsif (('%' eq $op) || ('mod' eq $op)) {
# Perl % is integer only
$base = int($base);
$palam = int($palam);
return $ctx->error(MT->translate('Division by zero.'))
if $palam == 0;
return $base % $palam if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
elsif (('++' eq $op) || ('inc' eq $op)) {
return ++$base if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
elsif (('--' eq $op) || ('dec' eq $op)) {
return --$base if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
elsif (('&' eq $op) || ('join' eq $op)) {
return $base . $palam;
}
elsif ('zero' eq $op) {
return sprintf("%0".$palam."d", $base);
}
elsif ('rand' eq $op) {
return $base + int(rand($palam))+1 if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
elsif ('int' eq $op) {
return int($base) if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
elsif ('round' eq $op) {
return round($base, $palam) if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
elsif ('floor' eq $op) {
return floor($base) if defined $base && $base =~ m/^\-?[\d\.]+$/; #by POSIX
}
elsif ('ceil' eq $op) {
return ceil($base) if defined $base && $base =~ m/^\-?[\d\.]+$/; #by POSIX
}
elsif ('sin' eq $op) {
return sin($base) if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
elsif ('cos' eq $op) {
return cos($base) if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
elsif ('tan' eq $op) {
return sin($base)/cos($base) if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
elsif ('deg2rad' eq $op) {
return ($base / 180) * PI if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
elsif ('rad2deg' eq $op) {
return ($base / PI) * 180 if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
elsif ('log' eq $op) {
return log($base) if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
elsif ('pow' eq $op) {
return ($base ** $palam) if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
elsif ('sqrt' eq $op) {
return sqrt($base) if defined $base && $base =~ m/^\-?[\d\.]+$/;
}
return $base;
}
sub round {
my $val = shift;
my $col = shift;
my $r = 10 ** $col;
my $a = ($val > 0) ? 0.5 : -0.5;
return int($val * $r + $a) / $r;
}
1;
ダウンロードは以下から。
http://www.apstars.com/blog/download/calcexp.zip使い方は以下。
http://www.apstars.com/blog/215/mt41mtcalcexp.phpMTのコードのみで...!
線形合同法による、MTタグでの乱数の取得のやり方。とくに難しいことはない。そのまんまMTMLなコードで実現できる。
<MTIgnore>線形合同法による乱数発生</MTIgnore>
<MTSetVarTemplate name="RndValGet">
<MTSetVarBlock name="tmp"><MTDate format="%S"></MTSetVarBlock>
<MTSetVar name="tmp" value="3" op="*">
<MTSetVar name="tmp" value="5" op="+">
<MTSetVar name="tmp" value="13" op="%">
<MTGetVar name="tmp">
</MTSetVarTemplate>
<MTGetVar name="RndValGet">
これを最初にMTMLコードで実現したのは、わたしの知る限りでは、現在はシックス・アパートに所属するaklaswadさんである。
http://blog.aklaswad.com/2008/000409.html書き方がな...tmp演算にtmp変数のそのものを使うという、いかにもプログラムな使い方を覚えんと、パニックになるかもしれんかもしれんが知らん。tmp=tmp+5みたいな記述だったら=の右辺が先に計算されるんだよ。
初回にtmpへシステム時間の秒を入れている点が、ポイントか。再構築の瞬間に多数の乱数を得たいときには、もしかすると(というか必ず)プラグイン版のほうがいい結果を返す。
しかしながら、乱数の精度が低くていい、ちょっとした用途、であれば、十分使える。
- カテゴリ:211Movable Type4
トラックバック(0)
このブログ記事を参照しているブログ一覧: MTで乱数を発生させる(ダイジェスト)
このブログ記事に対するトラックバックURL:
- Categories
- Entries
-
- MTで乱数を発生させる(ダイジェスト)
- MT4.2:テンプレートタグのみで切り捨て、切り上げ、四捨五入の演算
- Movable Typeデザインカスタマイズブック
- MT4.2:海外からのコメントスパムに簡単に対応する
- MT4.2 インストール
- MT4:エントリ投稿画面をホゲる実験
- MT4LP5で得たもの
- MT4LP5に参加しました
- MT4.1:mtde.info 開設しました。
- Movable Type4で、かなり気に入っていること
- Movable Type4で、かなり気に入らないこと
- MT4.1:CustomEditorButton2 プラグイン
- MT4.1:「テンプレートの編集」画面のコードスニペットを拡張する
- MT4.1:自サイト・他サイトのFeed情報を取得してリスト化(続編)
- 日記(K0、mtde、MT)
- MT4.1:自サイト・他サイトのFeed情報を取得してリスト化
- ノープラグインでカテゴリーソート(MT4.1専用版)多分に反則
- 自サイト内の特定カテゴリのRSSを出力
- MT4.1:モジュール化(雑談ですが)
- MT4.1:カテゴリリストへ代表画像を付与する(Asset系)
- MT4.1:カテゴリリスト+エントリ全展開+エントリのAsset代表画像表示
- MT4.1:イメージの幅指定で高さを自動的に計算(Asset系)
- MT4.1:MTでサポートされない演算をJavaScript関数ライブラリ化する
- MT4.1:エントリと同じタグのついた他エントリをリストアップする(自エントリを強調表示・改良版)
- エントリと同じタグのついた他エントリをリストアップする(自エントリを強調表示)
- 最新記事で使用されているタグの最新5件を表示
- MT4.1:エントリリストへ、特定カテゴリ用画像をつける
- MT4LP5
- MT4.1で乱数を取得したい場合
- ★マークでエントリ数を示すエントリリストつきカレンダー
- 横型カレンダー(素ノーマル)
- ファンキーな横置きカレンダー
- サムネイル画像エントリリストの改造(MT4.1用)
- MT4.1 ついにリリース
- 日記
- MT4.1:変数2つでの演算 (2)
- MT4.1:テンプレートタグで100までの数から素数を求める
- MT4.1:変数2つでの演算
- 日記
- MT4.1:年度タイトルつき月別アーカイブ(4月で新年度切り替え)
- MT4.1:年タイトルつき月別アーカイブ(1月で新年切り替え)
- 全カテゴリからエントリを3件ずつ表示する。キメウチ禁止
- MT4.1:カテゴリの並べ替え+表示切り替え+現カテゴリ展開+強調表示つき(カスタムフィールド+ハッシュ変数)
- MT4.1:カテゴリの並べ替え+表示切り替え(カスタムフィールド+ハッシュ変数)
- MT4.1:カテゴリの並べ替え(カスタムフィールド+ハッシュ変数)
- 日記
- MT4.1:文字列を繋げる
- MT4.1:カテゴリの並べ替え(プラグイン使わず)
- エントリと同じタグのついた記事一覧をリストアップ(3)
- あるエントリの存在するカテゴリの、サブカテゴリ内のエントリを抽出する
- 配列に対するpopとshift
- MTのテンプレートタグでFizzBuzz。
- エントリと同じカテゴリ内のエントリ一覧取得
- MT4.1:Forループ(文字列の連結)
- MT4.1:Forループ(配列中より特定のデータのインデックスを取得)
- MT4.1:Forループ(配列の並びを逆にする)
- MT4.1:Loopループ(基本形)
- MT4.1:Forループ(基本形)
- MT4.1:配列サンプル(配列の先頭・末尾からデータ取得・削除)
- MT4.1:配列サンプル(特定カテゴリの全エントリのみを配列へ代入)
- MT4.1:配列サンプル(全カテゴリを配列へ代入)
- 外部ブログのRSSを自サイトへ読み込み
- 名無しコメントに対応する
- 複数カテゴリの最新情報5件(例2)
- 複数カテゴリの最新情報5件(例1)
- カテゴリごとの表示形態を変える(多カテゴリ対応)
- 特定のカテゴリの最新エントリ5件をメインページへ表示
- 変数専用モジュールで取得したカテゴリ情報配列をほかのモジュールで使用する
- 定数・変数専用のモジュールを使う
- タグ名の全取得、配列へセット、生成文字列連結
- カテゴリ名の全取得、配列へセットする
- サムネイル画像エントリリストの改造(さらにチューン)
- サムネイル画像エントリリストの改造(OK版)
- サムネイル画像エントリリストの改造
- MT4のコメントフォーム
- 配列使ってみたテスト
- ブログ記事投稿時のタグ・キーワードとか
- 実験記事:キーワードのつけ方と概要の書き方
- デザイン小変更
- MT4書籍購入
- MT4で日本語を用いたタグクラウドがおかしい・~が出ない問題点
- 小粋な本の購入
- ちょっと気づいたこと
- MTSetVarでクリッカブルマップ
- 画像サムネイルエントリリスト(改)
- MTGetVarによるアンカーリンク
- MT3>MT4バージョンアップ時不具合
- pageを用いたナビゲーションバー
- 画像の取り扱い
- MT3サイトをMT4サイトへコンバート
- 月別アーカイブのタイトルが0000年12月となる不具合
- MT4で、エントリが再構築されないとき
- MTGetVarで文字列置換
- エントリと同じタグのついた記事一覧をリストアップ(2)
- 同一カテゴリーに属するエントリ一覧
- Folderの親子関係を調べる
- FolderLabel・FolderDescription関係調査
- カテゴリ・エントリリスト(改)
- カテゴリ・エントリリスト
- folder調査用テンプレート(1)
- トップレベルのウェブページのみ抜き出す
- ドロップダウンタグリスト
- Feed情報調査用テンプレート
- MTEntryCreatedDate
- コメント調査用テンプレート
- カテゴリ数、エントリ数、ウェブページ数の取得
- strip_tagsモデファイア
- replaceモデファイア
- regex_replaceモデファイア
- count_paragraphsモデファイア
- count_charactersモデファイア
- catモデファイア
- count_wordsモデファイア
- MTAuthor関連調査
- 画像サムネイルエントリリスト
- MTAsset関連調査(2)
- MTAsset関連調査
- カテゴリ毎に表示を変えるには?
- 強調表示付きカテゴリリスト
- MT4ライセンス購入
- MT4:Webページで生成するグローバルナヴィゲーション
- MT4:エントリと同じタグのついた記事一覧をリストアップ
- MT4:テンプレート構想変更
- MT4:beta7の生成xhtmlコード解析、ほか
- MT4:うっかりやってはいけないこと
- MT4:スタイルシートの切り替え
- MT4:モジュール化成果
- MT4:モジュール化・アルファ(本文)エリアの改造
- MT4:モジュール化・システムテンプレート
- MT4:モジュール化・ウェブページ
- MT4:モジュール化・エントリアーカイブページ
- MT4:モジュール化・カテゴリアーカイブページ
- MT4:モジュール化・アルファ(本文)エリア
- MT4:エントリについて
- MT4:モジュール化・バナーエリア
- MT4:モジュール化・ヘッダコード
- MT4:モジュール化・モジュール名の命名規則
- MT4:モジュール化・基本形改造
- MT4:XML宣言モジュール
- MT4:モジュール化・基本形
- MT4:カテゴリソート(MTCategoryLabel remove_html="1")
コメントする