2016-05-02 8 views
-1

bashでランダムに "a"と "-a"を生成する必要があります。配列の総和がゼロでなければならないという意味の「a」と「-a」が同数必要です。これに似た何か:bashで等しい数の2つの値を生成する方法

n=20; 
for i in seq 1 1 n 
do 
    if test $RANDOM -ge 16378 
    then 
     a=1 
    else 
     a=-1 
    fi 
done 

これに類似のいくつかのものは、ランダムに「」と「-a」を生成しますが、合計は常にゼロではありません。コードでこの条件をどのように適用する必要がありますか?

ありがとう

+0

によって提案されたコードにコメントが追加されました。 – tripleee

+0

あなたの状態はそれ以上ランダムにならないでしょう。 – Jens

+0

あなたは、 'a'の_n_番号に対して、' -a'の_n_番号があるべきだと言っているので、合計はゼロですが、 'ランダムに'順序づけされるべきですか? –

答えて

2

もっと簡単なものを実際に探しているかもしれないので、別の答えを追加します。あなたが1との10をしている10そのうち20の値、をループにしたい場合は-1があり、ランダムな順序で、私はこれを行うだろう:

$ for i in {1..10}; do echo 1; echo -1; done | shuf 
-1 
1 
-1 
1 
-1 
1 
-1 
1 
1 
1 
-1 
1 
-1 
-1 
-1 
-1 
1 
1 
1 
-1 
+0

私はこの答えが好きです。単に、要件を満たしているようです。実際には – SaintHax

+0

です。ありがとう – Elin

2

私は、その配列のランダムな順列を取得し、aのいくつかの数と同じ数の-aで既知の長さの配列を作成することと同じようにあなたの質問を解釈します。

bashで行う必要がありますか?そうであれば、最初に目的の長さの配列を作成し、それをシャッフルすることができます。 BashFaqから

この関数は、クヌース・フィッシャーイエーツシャッフルアルゴリズムを使用して、インプレース配列の要素をシャッフル。 (Simple method to shuffle the elements of an array in BASH shell?からコピー)

#!/bin/bash 

shuffle() { 
    local i tmp size max rand 

    # $RANDOM % (i+1) is biased because of the limited range of $RANDOM 
    # Compensate by using a range which is a multiple of the array size. 
    size=${#array[*]} 
    max=$((32768/size * size)) 

    for ((i=size-1; i>0; i--)); do 
     while (((rand=$RANDOM) >= max)); do :; done 
     rand=$((rand % (i+1))) 
     tmp=${array[i]} array[i]=${array[rand]} array[rand]=$tmp 
    done 
} 

あなたがbashに限定されるものではない場合、あなただけのshufdo it as a one-linerからforループを使用することができます。

+0

答えがありがとう、私はbashを使用する必要がありますが、私はこれをPythonやMATLABで行うことができます、私はbashで良くありません!私はこれを試し、私が得るものを見てみましょう!私は質問があれば私は戻ってきます。 :) – Elin

+0

上記のコードで何を言っているのかは、配列を生成してから並べ替える必要があることです。私の質問は、同じ数の "a"と "-a"の値で配列を生成する方法です。配列の長さがn = 20の場合、それらのうちの10個を "a"と等しくし、他の10個を "-a"に等しくしたいとします。しかし、私はまた、[a -a -a -aa -aaa -a ...]のようにランダムに分布させたい。私は確信していない場合私は十分に明確ですか? :/ – Elin

+0

知られている順序でそれらを生成してから、それらをシャッフルして何が問題になりますか。それは同じ結果ではありませんか? – leekaiinthesky

0

かなり単純ですが、あなたはRANDOMをより良く使うことを学ぶ必要があります。

範囲内でランダムを取得するには、範囲の長さでmodを変更します。この場合、それは私はあなたが結果を見たいと仮定していますので、$((RANDOM%2))

declare -i total=0  # you need to define this as an integer for += later 
for i in {1..20}; do 
    declare -i num=$((RANDOM % 2)) # define an integer var 
    [ $num -lt 1 ] && ((--num))  # if it's zero, change to -1 
    echo $num  # see the number picked 
    total+=$num 
done 
echo "total = $total" 

バイナリです。それを合計したい場合は、ループの外側に変数を宣言して使用します。私はそれを編集します。

+0

@SainHax答えはあなたよりも。これは、私がゼロの合計を与えないものと同様に機能します。たぶん私はもっと明確にする必要があります。上記のコードでは、これらの "20"の値のうち、10が "1"、もう1つが "-1"である必要があります。 – Elin

+0

@Elinはい、あなたは明確ではありませんでした。あなたの最後の段落は、あなたが望むものと思われました。私は編集します。 – SaintHax

-1

これは、あなたが望むものであるかもしれません。 'a'と '-aを組み合わせた乱数を生成し、それぞれの数の半分を文字列中のaの数を文字列中の-aの数とする。私が質問を誤解したかどうか教えてください。文字列の最大長を制限することができ これは

# l represents half the length of the array 
l=1; # Sets l to 1, set the following while statement evaluates true 
# Sets l to $RANDOM until it is an even number 
while [ $((l % 2)) -ne 0 ]; do 
    l=$RANDOM; 
done; 
echo $l; 
# Sets m and n to l 
n=$l; # n is the number of 'a's 
m=$l; # m is the number of '-a's 
# Initialises result as an empty string 
result=""; 
# Doesn't stop until both 'a's and '-a's have been exhausted, i.e. n and m both equal 0 
while [ "$n" != "0" ] && [ "$m" != "0" ]; do 
    # Decides between 'a' and '-a' 
    i=$(($RANDOM % 2)); 
    # Evaluates true if $i is 0, and the number of '-a's has not been exhausted, however also evaluates true if the number of '-a's has been exhausted 
    if ([ "$i" == "0" ] && [ "$n" != "0" ]) || [ "$m" == "0" ]; then 
     # Appends 'a' to result 
     result="$result a"; 
     # Decrement the amount of 'a's left 
     n=$((n-1)); 
    # Evaluates true if $i is 1, and the number of 'a's has not been exhausted, however also evaluates true if the number of 'a's has been exhausted 
    elif ([ "$i" == "1" ] && [ "$m" != "0" ]) || [ "$n" == "0" ]; then 
     # Appends '-a' to result 
     result="$result -a"; 
     # Decrements the amount of '-a's left 
     m=$((m-1)); 
    fi; 
done; 
# Prints the result 
echo $result; 

EDITを必要とする場合、教えてください:それはそれは予測可能だ場合本当にランダムではありませんSaintHax

+0

なぜlは渡された値の代わりにランダムですか?また、このコードにコメントはなく、変数名l、n、mを使用していますか?これは避けるべきです。 mまたはnが0になったときにデフォルトのアクションを実行した方がずっと速くなります。 – SaintHax

+0

@SaintHax私のコードには明確性がないことを申し訳なく思っています。私はできるだけ早くコメントを追加しますが、プログラミングに正式な訓練をしていない15歳です。私はただ助けようとしているだけです。 –

関連する問題