2012-03-06 3 views
0

`私は計算を言うことができます。私がしたいことは、結果を計算する関数でいくつかのループを実行することです。時には、この関数はループに詰まってしまうので失敗するので、ivはループを終了するためにそれをカバーしましたが、私の問題はこの関数を再起動したいと思います。 。平均して要求には20のうちの約1の結果がありません。私は清潔なスレートから機能を再開する必要があります。PHPきれいな状態から関数を再利用する方法

私はout success.pleaseでプロセスを再実行する前にすべてのバールを解除しようとしましたが、この機能はプロセスに渡された情報から時々失敗しますので避けられません。 これは私がちょうど自動的に結果を生成する関数です。

http://www.gamezslave.com/test/DynamicSlots.swfこれは私の試作プロトタイプです。 この要素のためにエラーが発生することがあります。

<?php 
$checker = 0; // if i cant get a result i could use this will tick up until condition 
function shuffleArray($myArray) { 
    $value_count = array_count_values($myArray); 
    $last_value = $myArray[count($myArray) - 1]; 
    unset($myArray[count($myArray) - 1]); 
    $shuffle = array(); 
    $last = false; 

    while (count($myArray) > 0) { 
     $keys = array_keys($myArray); 
     $i = round(rand(0, count($keys) - 1)); 
     while ($last === $myArray[$keys[$i]]) { 
      $i = round(rand(0, count($keys) - 1)); 
    echo "stuck"; 
      $checker++; 
    if($checker>10){ 
     echo " Too many checks so die, and restart process "; 
     return false; 
     bob; // this is the check function to goto and restart 
    } 
     } 
     $shuffle[] = $myArray[$keys[$i]]; 
     $last = $myArray[$keys[$i]]; 
     unset($myArray[$keys[$i]]); 
    } 

    if ($last_value === $last) { 
     $i = 0; 
     foreach($shuffle as $key=>$value) { 
      if ($value !== $last_value) { 
       $i = $key; 
       break; 
      } 
     } 
     array_slice($shuffle, $i + 1, 0, $last_value); 
    } else { 
     $shuffle[] = $last_value; 
    } 
    return $shuffle; 
} 

print_r(shuffleArray(array(1,5,5,3,7,7,7,7))); // just a example 
function bob(){ 
if($checker>10){ 
    $checker = 0; 
    shuffleArray(); 
    echo "bob"; 
     reset($myArray); // thought this may clean/reset the array i couldnt use 
    } 
} 

このシャッフルは、同一のどの2つのシンボルelemtsが互いに隣時にはアレイの終わりに、そのシャッフリングを無作為不良確率(リンゴ、オレンジ、オレンジと左イムようになることを返し考え、オレンジ)ので、私は何をする必要があるので、最初からこのプロセスを再開することです。配列に約10の異なるアイテムがあり、それぞれ10個のリンゴ、10個のオレンジ、4個のバナナ、3個のブドウが重複している場合があります。私は配列の最後に同じ項目のあまりにも多くのあまりにも貼って、私はスクリプトを再実行する必要があります(そして、このビットは問題です)私はどのように知っている。

+6

こんにちは、私たちがあなたを助けることができるようにあなたのコードを投稿しますか?上記のコード –

+0

、whats goin onのリンクもあります...ありがとう – joshua

答えて

1

私はあなたの関数の内部ですべての変数にデフォルト値を設定し、パラメータとしてアクティブなものを渡します。その後、一連の戻りコードを使用して成功または失敗を示すか、結果を何らかの方法で検証して再実行します。

+0

ivは現在これを試してみましたが、時にはそれが一貫していません – joshua

+0

私はあなたの答えを選んで問題を解決しようとしましたが、これまで提供されていた他の答えは私の方法を模擬しています。あなたの入力に感謝 – joshua

3

グローバルを使用していますか?

はいの場合:停止します。それはひどい練習です。真剣に。どんな種類の正気なコードでもグローバルを使う理由はありません。

いいえ:何もしません。各関数呼び出しはクリーンスレートです。

編集コードを見た後、私はちょっと言葉がありません。

http://us3.php.net/manual/en/function.shuffle.php

+0

グローバルを使用していない場合は、何もする必要はありません。関数の各呼び出しは「新鮮」です。 –

+0

アルゴリズムが悪いからです。どのような回避策も論理エラーを修正するものではありません。 –

+0

あなたはこのシャッフル機能を理解していますので、同じリンゴ、リンゴ、リンゴ、リンゴはいつもどこにあるのでしょうか?それはなぜスクリプトのエラーが100個のエリートを配列で想像しているのかということですが、シャッフルを再開する場合は – joshua

0

私はここタイラー軒に同意していると私は別として追加したいが、プログラミングにおいて非常に重要なトピックを返信:

機能理論的には、それが影響してはならない可能性が意味としてスカラーとしても「必要があります」同じパラメータについて毎回同じ情報を返す必要があります。

パラメータがX、Y、Zの関数を呼び出して、システムが同じ状態のときにもう一度呼び出すと、関数はまったく同じ結果を返さなければなりません。

外部データ(ファイル、データベース行または単一インスタンスのアクセス可能なクラスデータ)に依存するなどの関数がスカラー(例:Virtual)でない場合、この関数の外部データに理論的に影響しないか、関数は複数回異なる結果を返します...

+0

それはシャッフルを実装するために本当に驚くほど悪い方法です。しかし、それほど気分が悪くない、あなたがしたいことはKnuth shuffle(あなたが簡単なやり方でstdlib関数を使っていない場合)と呼ばれるものです。アルゴリズムはかなりシンプルです。長さNの配列の場合、カウンタをN-1に初期化し、これを 'i'と呼ぶ。 0とカウンタの間の乱数xを生成する。 'arr [x]'と 'arr [i]'に要素を入れ替えます。要素は、それ自身でスワップすることができます。今度は、カウンタを1だけ減らして元に戻り、別の数を生成してください。 'i'が0になるまで続けます。すべての可能な注文を生成します。 –

+0

いいえ、私はしません。それはシャッフルではありません。あなたの仮説関数は、リスト[1,1,1]が与えられたときに何を生成するでしょうか? –

+0

クヌースシャッフル私はこれを見ているが、これは何をやっているのか、何もしていない、笑...私はそれらが配列1,2,3,2,3,1,2ランダムではあるが、問題が発生するのは、「1,2,1,2のように最後に2つの数字がついていて、2だけしか残っていないので、別のランダムな順序を試すためにスクリプトを再実行したい – joshua

関連する問題