Showing posts with label Random. Show all posts
Showing posts with label Random. Show all posts

Algorithms related with Randomness



Write a method to shuffle a deck of cards. It must be a perfect shuffle - in other words, each 52! permutations of the deck has to be equally likely. Assume that you are given a random number generator which is perfect. - From Cracking the Code Interview

public static void shuffleArray(int[] cards) {
   int temp, index;
   for (int i = 0; i < cards.length; i++){
     index = (int) (Math.random() * (cards.length - i)) + i;
     temp = cards[i];
     cards[i] = cards[index];
     cards[index] = temp;
   }
}

Write a method to randomly generate a set of m integers from an array of size n. Each element must have equal probability of being chosen. - From Cracking the Code Interview
public static int rand(int lower, int higher) {
 return lower + (int)(Math.random() * (higher - lower + 1));
 }
 /* pick M elements from original array. Clone original array so that
 * we don’t destroy the input. */
 public static int[] pickMRandomly(int[] original, int m) {
   int[] subset = new int[m];
   int[] array = original.clone();
   for (int j = 0; j < m; j++) {
     int index = rand(j, array.length - 1);
     subset[j] = array[index];
     array[index] = array[j]; // array[j] is now “dead”
   }
   return subset;
 }

Random number 1..5 to 1..7



int rand7()
{
 int x = 22;
 while( x > 21)
  x = rand5() + 5*rand5() - 5;
 int r = 1 + (x % 7);
 return r;
}

int rand7()
{
 int x = 25;
 while( x > 21)
  x = rand5() + 5*rand5() - 5;
 
 int r = (x >> 3) + (x & 7);
 r = (r >= 7) ? r - 6 : r + 1;
 return r;
}

A dice, when you throw gives only 1,2,.....21 (since you are rejecting 22,23,24,25 a.k.a rejection sampling theorem) 
So total no. of possible are 21.
No. of ways getting "1"=3 (5*1+1-5,5*2+3-5,5*3+1-1)%7+1
No. of ways getting "2"=3 (5*1+1-5,5*2+3-5,5*3+1-1)%7+1
No. of ways getting "3"=3 (5*1+2-5,5*2+4-5,5*3+2-1)%7+1
and so on..
P(1)=3/21=1/7
P(2)=3/21=1/7 and so on...

Understand why these solutions are not right
http://www.geeksforgeeks.org/generate-integer-from-1-to-7-with-equal-probability/

x=foo()+foo()-1;
if (x !=8,9){
return x;
}

Now what's the probability here for p(1),p(2)...p(7)?
no. of ways of producing "1" =1 (1+1-1)
no. of ways of producing "2" =2 (2+1-1,1+2-1)
and so on...
Total no. of possible combination =5*5=25
P(1)=1/25;
P(2)=2/25
and so on...
So probabilities are not equal in this case !!

return (foo() + foo()%4 -1);
(foo()+foo()-1)%7+1

Also refer to http://www.geeksforgeeks.org/generate-integer-from-1-to-7-with-equal-probability/
Read full article from Random number 1..5 to 1..7

Random number generator in arbitrary probability distribution fashion | GeeksforGeeks



Given n numbers, each with some frequency of occurrence. Return a random number with probability proportional to its frequency of occurrence.

O(n) Space
1. Take an auxiliary array (say prefix[]) of size n.
2. Populate it with prefix sum, such that prefix[i] represents sum of numbers from 0 to i.
3. Generate a random number(say r) between 1 to Sum(including both), where Sum represents summation of input frequency array.
4. Find index of Ceil of random number generated in step #3 in the prefix array. Let the index be indexc.
5. Return the random number arr[indexc], where arr[] contains the input n numbers.
int findCeil(int arr[], int r, int l, int h)
{
    int mid;
    while (l < h)
    {
         mid = l + ((h - l) >> 1);  // Same as mid = (l+h)/2
        (r > arr[mid]) ? (l = mid + 1) : (h = mid);
    }
    return (arr[l] >= r) ? l : -1;
}
 
// The main function that returns a random number from arr[] according to
// distribution array defined by freq[]. n is size of arrays.
int myRand(int arr[], int freq[], int n)
{
    // Create and fill prefix array
    int prefix[n], i;
    prefix[0] = freq[0];
    for (i = 1; i < n; ++i)
        prefix[i] = prefix[i - 1] + freq[i];
 
    // prefix[n-1] is sum of all frequencies. Generate a random number
    // with value from 1 to this sum
    int r = (rand() % prefix[n - 1]) + 1;
 
    // Find index of ceiling of r in prefix arrat
    int indexc = findCeil(prefix, r, 0, n - 1);
    return arr[indexc];
}

One simple method is to take an auxiliary array (say aux[]) and duplicate the numbers according to their frequency of occurrence. Generate a random number(say r) between 0 to Sum-1(including both), where Sum represents summation of frequency array (freq[] in above example). Return the random number aux[r] (Implementation of this method is left as an exercise to the readers).
The limitation of the above method discussed above is huge memory consumption when frequency of occurrence is high. 

Read full article from Random number generator in arbitrary probability distribution fashion | GeeksforGeeks

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts