commit 5cf34c5f047228b50270a6cb2bb979c8644b59c0
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Apr 10 13:46:18 2020 +0100

    Make chances to randimoze a given row when scrambling dependant on the type of Object.
    
    The point: in case of the Cube, all rows should have equal chances. In case of the Pyraminx, the smaller the row, the smaller the chance should be. In particular the trivial 4 corners of the tetraherdon should have a very small chance to be selected.

diff --git a/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java b/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java
index f2a86636..6ccf9f8c 100644
--- a/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java
+++ b/src/main/java/org/distorted/effects/scramble/ScrambleEffect.java
@@ -72,7 +72,7 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
   private RubikObject mObject;
   private int mNumAxis;
   private int mBasicAngle;
-  private int mSize;
+  private float[] mRowChances;
 
   Effect[] mNodeEffects;
   int[] mNodeEffectPosition;
@@ -142,10 +142,22 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
         mLastVector = (newVector>=mLastVector ? newVector+1 : newVector);
         }
 
-      int rowBitmap  = (1<<mRnd.nextInt(mSize));
+      int row=0;
+      float rowFloat = mRnd.nextFloat();
+
+      for(int i=0; i<mRowChances.length; i++)
+        {
+        if( rowFloat<=mRowChances[i] )
+          {
+          row=i;
+          break;
+          }
+        }
+
+      int rowBitmap  = (1<<row);
       int angle= randomizeAngle();
       int absAngle = (angle<0 ? -angle : angle);
-      long durationMillis =  absAngle*mDurationSingleTurn;
+      long durationMillis = absAngle*mDurationSingleTurn;
 
       mNumScramblesLeft--;
       if( absAngle==2 ) mNumDoubleScramblesLeft--;
@@ -306,12 +318,12 @@ public abstract class ScrambleEffect extends BaseEffect implements EffectListene
     {
     mObject     = post.getObject();
     mPostRender = post;
+    mRowChances = mObject.getRowChances();
 
     mObject.solve();
 
     mNumAxis    = mObject.getRotationAxis().length;
     mBasicAngle = mObject.getBasicAngle();
-    mSize       = mObject.getSize();
 
     int numScrambles = post.getNumScrambles();
     int dura = (int)(duration*Math.pow(numScrambles,0.6f));
diff --git a/src/main/java/org/distorted/objects/RubikCube.java b/src/main/java/org/distorted/objects/RubikCube.java
index 3cdaf9ea..497c1622 100644
--- a/src/main/java/org/distorted/objects/RubikCube.java
+++ b/src/main/java/org/distorted/objects/RubikCube.java
@@ -219,6 +219,21 @@ class RubikCube extends RubikObject
     return getSize();
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public float[] getRowChances()
+    {
+    int size = getSize();
+    float[] chances = new float[size];
+
+    for(int i=0; i<size; i++)
+      {
+      chances[i] = (i+1.0f) / size;
+      }
+
+    return chances;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public float returnRotationFactor(float offset)
@@ -337,8 +352,6 @@ class RubikCube extends RubikObject
       objectString.append(FACE_NAMES[color]);
       }
 
-    // android.util.Log.e("cube", "string: "+objectString.toString());
-
     return objectString.toString();
     }
 }
diff --git a/src/main/java/org/distorted/objects/RubikObject.java b/src/main/java/org/distorted/objects/RubikObject.java
index e9cf9f2a..a1d8a465 100644
--- a/src/main/java/org/distorted/objects/RubikObject.java
+++ b/src/main/java/org/distorted/objects/RubikObject.java
@@ -588,4 +588,5 @@ public abstract class RubikObject extends DistortedNode
   public abstract float returnMultiplier();
   public abstract float returnRotationFactor(float offset);
   public abstract String retObjectString();
+  public abstract float[] getRowChances();
   }
diff --git a/src/main/java/org/distorted/objects/RubikPyraminx.java b/src/main/java/org/distorted/objects/RubikPyraminx.java
index 487837dd..627fb6c7 100644
--- a/src/main/java/org/distorted/objects/RubikPyraminx.java
+++ b/src/main/java/org/distorted/objects/RubikPyraminx.java
@@ -310,6 +310,24 @@ public class RubikPyraminx extends RubikObject
     return getSize()/(SQ3/2);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public float[] getRowChances()
+    {
+    int size = getSize();
+    int total = size*(size+1)/2;
+    float running=0.0f;
+    float[] chances = new float[size];
+
+    for(int i=0; i<size; i++)
+      {
+      running += (size-i);
+      chances[i] = running / total;
+      }
+
+    return chances;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public float returnRotationFactor(float offset)
