@@ -585,16 +585,49 @@ struct commit_list *filter_skipped(struct commit_list *list,
585585 return filtered ;
586586}
587587
588- static struct commit_list * apply_skip_ratio (struct commit_list * list ,
589- int count ,
590- int skip_num , int skip_denom )
588+ #define PRN_MODULO 32768
589+
590+ /*
591+ * This is a pseudo random number generator based on "man 3 rand".
592+ * It is not used properly because the seed is the argument and it
593+ * is increased by one between each call, but that should not matter
594+ * for this application.
595+ */
596+ int get_prn (int count ) {
597+ count = count * 1103515245 + 12345 ;
598+ return ((unsigned )(count /65536 ) % PRN_MODULO );
599+ }
600+
601+ /*
602+ * Custom integer square root from
603+ * http://en.wikipedia.org/wiki/Integer_square_root
604+ */
605+ static int sqrti (int val )
606+ {
607+ float d , x = val ;
608+
609+ if (val == 0 )
610+ return 0 ;
611+
612+ do {
613+ float y = (x + (float )val / x ) / 2 ;
614+ d = (y > x ) ? y - x : x - y ;
615+ x = y ;
616+ } while (d >= 0.5 );
617+
618+ return (int )x ;
619+ }
620+
621+ static struct commit_list * skip_away (struct commit_list * list , int count )
591622{
592- int index , i ;
593623 struct commit_list * cur , * previous ;
624+ int prn , index , i ;
625+
626+ prn = get_prn (count );
627+ index = (count * prn / PRN_MODULO ) * sqrti (prn ) / sqrti (PRN_MODULO );
594628
595629 cur = list ;
596630 previous = NULL ;
597- index = count * skip_num / skip_denom ;
598631
599632 for (i = 0 ; cur ; cur = cur -> next , i ++ ) {
600633 if (i == index ) {
@@ -614,7 +647,6 @@ static struct commit_list *managed_skipped(struct commit_list *list,
614647 struct commit_list * * tried )
615648{
616649 int count , skipped_first ;
617- int skip_num , skip_denom ;
618650
619651 * tried = NULL ;
620652
@@ -626,11 +658,7 @@ static struct commit_list *managed_skipped(struct commit_list *list,
626658 if (!skipped_first )
627659 return list ;
628660
629- /* Use alternatively 1/5, 2/5 and 3/5 as skip ratio. */
630- skip_num = count % 3 + 1 ;
631- skip_denom = 5 ;
632-
633- return apply_skip_ratio (list , count , skip_num , skip_denom );
661+ return skip_away (list , count );
634662}
635663
636664static void bisect_rev_setup (struct rev_info * revs , const char * prefix ,
0 commit comments