原です。

>>  次の条件を満たすようなサイコロの組を求めよ。ただしサイコロの各面
>>  の出る確率は等しく、違う面に同じ数字が重複して書かれていてもよい。
>>  
>>  (1) サイコロは A, B, C, D の 4 つ。
>>  (2) サイコロは 6 面体。
>>  (3) 書かれる数字は 0 から 6 まで。
>>  (4) 異なるサイコロには異なる数字が書かれている。(引き分けがない)
>>  (5) 巡回的な強さをもつ。(つまり、X が Y に勝つ確率を p(X, Y) とす
>>    ると、p(A, B) = p(B, C) = p(C, D) = p(D, A) < 1/2)

>近岡です。

>帰宅時、車を運転しながらプログラムを考えていました。

うわー,器用ですね。っていうかいつもやるんですか?危ないです(^^;
運転気をつけて下さいね。

>多重ループで処理することにして、枝をかる条件を考えていると、
>いつの間にか解が求まってしまいました。

そうみたいですね。友人にこの問題を出したらやはり手で解いてしま
って,いきなり計算機を回して解いた自分がなさけなくなりました。

>条件(4)は、言い換えると「同じ番号が複数のさいころに書かれることはない」と
>いうことですから、条件(1)(3)とディリクレの引き出し論法(鳩ノ巣論法)により、
>ABCDのいずれか少なくとも1つは、全ての面が同じ番号です。

これが結構ポイントですね。

>サイコロA 6面とも3
>サイコロB 2面が6、4面が2
>サイコロC 3面が5、3面が1
>サイコロD 4面が4、2面が0

もちろん正解。

>==== プログラムはここから ====

このプログラムは,もともと頭を使って条件が絞れているのであっと
いう間に答えが出ますね。


次のプログラムは何の工夫もなくループを回したもので,答えが出る
までにずいぶん時間がかかります。最初に重複組み合わせ生成器 
rep_comb を定義しています。

-----^ efron.rb
class Array
  def rep_comb(n = size)
    if size == 0 && n > 0 or n < 0
    elsif n == 0
      yield([])
    else
      self.rep_comb(n - 1) do |x|
        yield([first] + x)
      end
      self[1..-1].rep_comb(n) do |x|
        yield(x)
      end
    end
  end
end

def cmp(a, b)
  large = 0
  a.each do |x|
    b.each do |y|
      if x > y then large += 1
      elsif x < y then large -= 1 end
    end
  end
  large
end

if $0 == __FILE__
  [0,1,2,3,4,5,6].rep_comb(6) do |x|
    labels1 = [0,1,2,3,4,5,6] - x
    labels1.rep_comb(6) do |y|
      if (pr = cmp(x, y)) < 0
        labels2 = labels1 - y
        labels2.rep_comb(6) do |z|
          if cmp(y, z) == pr
            labels3 = labels2 - z
            labels3.rep_comb(6) do |w|
              if cmp(z, w) == pr && cmp(w, x) == pr
                p [x, y, z, w]
              end
            end
          end
        end
      end
    end
  end
end
-----$ efron.rb


で,元々の問題で気になるのは

(1) 何で数字が 0-6 であって 1-6 でないのか。
(2) 何でサイコロは 4 つであって 3 つではないのか。

なんですが,結局 1-6 だと答えがないのですね。そしてサイコロが 3 
つだと答えが複数ある。その他,複数のサイコロに同じ数字を書くこと
を許したり,サイコロを 6 面でなくて任意にしたり,確率が循環的な
強さをもてば等確率でなくても良くしたりすると解はどうなるかという
と:

*オリジナル
$ efron2.rb -l0..6
[[0, 0, 4, 4, 4, 4], [1, 1, 1, 5, 5, 5], [2, 2, 2, 2, 6, 6], [3, 3, 3, 3, 3, 3]]

*ダイスが3つでもある
$ efron2.rb -t -l0..6
[[0, 0, 3, 3, 3, 6], [1, 1, 1, 4, 4, 4], [2, 2, 2, 2, 2, 5]]
[[0, 0, 3, 3, 6, 6], [1, 1, 4, 4, 4, 4], [2, 2, 2, 2, 5, 5]]
[[0, 0, 4, 4, 4, 4], [2, 2, 2, 2, 6, 6], [1, 3, 3, 3, 3, 5]]
[[0, 3, 3, 3, 6, 6], [1, 4, 4, 4, 4, 4], [2, 2, 2, 5, 5, 5]]

*数字が6つだとない
$ efron2.rb -l1..6

*数字が6つだと確率が不揃いならある
$ efron2.rb -l1..6 -n
[[1, 1, 5, 5, 5, 5], [2, 2, 2, 2, 6, 6], [3, 3, 3, 3, 3, 3], [4, 4, 4, 4, 4, 4]]

*ダイスが3つ数字が6つだと確率が不揃いならある
$ efron2.rb -t -l1..6 -n
[[1, 1, 4, 4, 4, 4], [2, 2, 2, 2, 5, 5], [3, 3, 3, 3, 3, 3]]
...(計26個)

*数字が5つだと確率が不揃いでもない
$ efron2.rb -l1..5 -n

*ダイスが3つ数字が5つでも確率が不揃いならある
$ efron2.rb -t -l1..5 -n
[[1, 1, 4, 4, 4, 4], [2, 2, 2, 2, 5, 5], [3, 3, 3, 3, 3, 3]]

*数字4つ重複ありで3面ダイス4個は確率が不揃いでもない
         ^^^^^^^^ 複数のダイスに同じ数字が乗る
$ efron2.rb -l1..4 -mn -f3

*数字4つ重複ありで4面ダイス4個
$ efron2.rb -l1..3 -m -f4
[[1, 1, 4, 4], [2, 2, 2, 4], [2, 2, 3, 3], [1, 3, 3, 3]]

*数字5つ重複ありで3面ダイス3個
$ efron2.rb -t -l1..5 -m -f3
[[1, 3, 4], [2, 2, 5], [2, 3, 3]]
[[1, 4, 4], [2, 2, 5], [2, 3, 4]]
[[1, 4, 4], [2, 3, 5], [3, 3, 4]]

*数字4つ重複ありで4面ダイス3個確率が不揃い
$ efron2.rb -t -l1..4 -m -f4
[[1, 1, 4, 4], [2, 2, 2, 4], [1, 3, 3, 3]](実は等確率)


という感じになります。これで使ったプログラムは以下のものです。

-----^ efron2.rb
require "efron"

require "getopts"
getopts("tmn", "l:0..6", "f:6")
labels = eval($OPT_l).to_a
faces = Integer($OPT_f)

Results = {}
def cyclic_store(result)
  return false if Results[result]
  result.each_index do |i|
    Results[result[i..-1] + result[0...i]] = true
  end
  true
end

labels.rep_comb(faces) do |x|
  labels1 = $OPT_m ? labels : labels - x
  labels1.rep_comb(faces) do |y|
    if (a = cmp(x, y)) < 0
      labels2 = $OPT_m ? labels1 : labels1 - y
      labels2.rep_comb(faces) do |z|
        if (b = cmp(y, z)) < 0 && ($OPT_n || a == b)
          if $OPT_t
            if (c = cmp(z, x)) < 0 && ($OPT_n || a == c) &&
                 cyclic_store([x, y, z])
              p [x, y, z]
              p [a, b, c] if $OPT_n
            end
          else
            labels3 = $OPT_m ? labels2 : labels2 - z
            labels3.rep_comb(faces) do |w|
              if (c = cmp(z, w)) < 0 && ($OPT_n || a == c) &&
                   (d = cmp(w, x)) < 0 && ($OPT_n || a == d) &&
                      cyclic_store([x, y, z, w])
                  p [x, y, z, w]
                  p [a, b, c, d] if $OPT_n
              end
            end
          end
        end
      end
    end
  end
end
-----$ efron2.rb

最後の場合の「4面ダイス」というのが不自然なんですが,カードと考
えればよくて,つまり4枚セット3組のカードが

  [1, 1, 4, 4], [2, 2, 2, 4], [1, 3, 3, 3]

であるとき「強さが循環的」という現象が起こる。というのが人に説明
するとき一番計算し易いかと思います。

サイコロ3個,数字は1から6まで,数字の重複可,確率不揃い可,と
いう自然な設定で,何通りあるか知りたいのですが,つまり

  $ efron2.rb -l1..6 -tmn

の結果を知りたいのですが,解が多すぎるせいか答えが返って来ませ
んでした。プログラムが悪いんですね。