Maximum value's random index

本文介绍了一种从数组中随机选取最大值索引的方法。首先遍历数组找到最大值及其出现次数,然后生成一个随机数作为最大值的第几次出现,并再次遍历数组返回该次出现的最大值的索引。
#include <vector>
#include <iostream>
#include <cstdlib>
#include <climits>
#include <time.h>
using namespace std;

// naive method
// Go through the array once, find the max and the number of occurrences (n)
// Generate a random number (r) between 1 and n
// Go through the array again, return rth occurrance.
int randomIndex(vector<int>& nums) {
  int max_val = INT_MIN;
  int count = 0;
  for(int i = 0; i < nums.size(); ++i) {
    if(nums[i] > max_val) {
      max_val = nums[i];
      count = 1;
    } else if(nums[i] == max_val) {
      count++;
    }
  }
  srand(time(NULL));
  int random_value = rand() % count + 1;
  cout << random_value << endl;
  cout << "random value is" << endl;
  int max_index = 1;
  for(int i = 0; i < nums.size(); ++i) {
    if(nums[i] == max_val && max_index == random_value) {
      return i;
    } else if(nums[i] == max_val) max_index++;
  }
}

int main(void) {
  vector<int> nums{2, 1, 2, 1, 5, 4, 5, 5};
  cout << randomIndex(nums) << endl;
}

class IntegerEdgeCases(Mutator): def __init__(self, obj, rand): Mutator.__init__(self) min_, max_ = self.get_limits(obj) delta = max_ - min_ if 0xff >= delta >= 0: # We are <= a single byte, set the space size of the range self.space = delta + 1 self.full_space = self.space def sequential(): return min_ + self.mutation_index def random(): return rand.randint(min_, max_) self.sequential_generator = sequential self.random_generator = random else: # For more than a single byte, use edge case generator self.generator = EdgeCaseGenerator(min_, max_) self.space = len(self.generator.values) self.full_space = self.generator.deviation def sequential(): return self.generator.values[self.mutation_index] def random(): return self.generator.gen_next(rand) self.sequential_generator = sequential self.random_generator = random def get_limits(self, obj): """ Get the minimum and maximum values to generate edge cases for. :param obj: The element this mutator is bound to. :return: The minimum value of the number space, The maximum value of the number space. """ return 0, sys.maxsize def perform_mutation(self, obj, value): """ Mutate the data element. :param obj: The element to mutate. :param value: The value to use when mutating. :return: """ pass def mutate(self, obj, gen): value = gen() self.perform_mutation(obj, value) def sequential_mutation(self, obj): self.mutate(obj, self.sequential_generator) def random_mutation(self, obj): self.mutate(obj, self.random_generator) def get_count(self): return self.space 以上是utils.py中的 IntegerEdgeCases类 class StringLengthEdgeCase(IntegerEdgeCases): mutated_elements = [] def __init__(self, obj, rand): super().__init__(obj, rand) def get_limits(self, obj): max_ = obj.mutator_config.max_output_size * 8 size = obj.calculate_bit_size() limit = max(max_ , size) limit = (limit + 7) // 8 max_ = limit if obj.max_length is not None: max_ = min(max_, obj.max_length) min_ = 0 if obj.min_length is not None: min_ = max(min_, obj.min_length) return min_, max_ @classmethod def supported(cls, obj): if isinstance(obj, String): return True return False def perform_mutation(self, obj, value): obj.mutated_value = expand(obj.value, value) obj.mutated = True 以上是stringlengthedgecase.py中的继承类 这个代码为我一比一翻译成cpp版本
最新发布
07-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值