このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1299291519/777
#  #include <ctime> 
#  #include <cstdlib> 
#  #include <iostream> 
#   
#  using namespace std; 
#   
#  int main() 
#  { 
#   srand(time(NULL)); 
#   const int n = 10; 
#   int a[n]; 
#   
#   for (int i = 0; i < n; i++){ 
#  retry: 
#    ; 
#    a[i] = rand() % 10 + 1; 
#    for (int j = 0; j < i; j++) 
#     if (a[i] == a[i - j - 1]) 
#      goto retry; 
#     else; 
#   } 
#  } 
#   
#  goto文なしで書こうと思ったらどうなるんですか? 
#  もう少しスマートにしたいです 
# 
# 

乱数値のならびを得る(_要素数,_乱数下限,_乱数上限,_乱数値のならび) :-
        length(_乱数値のならび,_要素数),
        乱数値でならびを埋める(_要素数,_乱数下限,_乱数上限,_乱数値のならび).

乱数値でならびを埋める(_要素数,_乱数下限,_乱数上限,L) :-
        最初の変数を得る(_前ならび,_変数,L),
        乱数値でならびを埋める(_要素数,_乱数下限,_乱数上限,_前ならび,_変数,L).
乱数値でならびを埋める(_要素数,_乱数下限,_乱数上限,L).

乱数値でならびを埋める(_要素数,_乱数下限,_乱数上限,_前ならび,_変数,L) :-
        得られた乱数は初出である(_要素数,_乱数下限,_乱数上限,_前ならび,_変数,L),
        乱数値でならびを埋める(_要素数,_乱数下限,_乱数上限,L),!.
乱数値でならびを埋める(_要素数,_乱数下限,_乱数上限,_,_,L) :-
        乱数値でならびを埋める(_要素数,L).

最初の変数を得る(_前ならび,_変数,L) :-
        append(_前ならび,[_変数|_],L),
        var(V),!.

得られた乱数は初出である(_要素数,_乱数下限,_乱数上限,_前ならび,_乱数,L) :-
        乱数値を得る(_乱数下限,_乱数上限,_乱数),
        \+(append(_,[_乱数|_],_前ならび)),!.

乱数値を得る(_乱数下限,_乱数上限,_乱数) :-
        _乱数 is (random mod (_乱数上限-_乱数下限+1)) + _乱数下限.